简体   繁体   English

Child RecyclerView setadapter 在我的嵌套 RecyclerView Android 上不起作用

[英]Child RecyclerView setadapter doesn't work on my Nested RecyclerView Android

I have two RecyclerViews.我有两个 RecyclerViews。 Parent RecyclerView works perfectly but the setadapter of the child's in the parent adapter does not work. Parent RecyclerView 工作正常,但父适配器中子的 setadapter 不起作用。

I tried to make some log messages in the child adapter but they didn't even appear so the adapter is not even starting我试图在子适配器中制作一些日志消息,但它们甚至没有出现,因此适配器甚至没有启动

Below is the piece of code for better understanding.下面是一段代码,以便更好地理解。

MainFragment.java MainFragment.java

        // Set up the RecyclerView.
        recyclerview = rootView.findViewById(R.id.recycler_view);
        adapter = new TodayAdapter(getContext());
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerview.setAdapter(adapter);
        taskViewModel = new ViewModelProvider(requireActivity()).get(TaskViewModel.class);

        List<TaskList> categories = new ArrayList<>();

        TaskList completedTasks = new TaskList("Completed Tasks",null);
        TaskList incompletedTasks = new TaskList("Incompleted Tasks",null);
        List<Task> intask = new ArrayList<>();
        List<Task> comtask = new ArrayList<>();


        // Update the cached copy of the words in the adapter.
        // Get all the words from the database
        // and associate them to the adapter.
        taskViewModel.getAllTasks().observe( getActivity(), new Observer<List<Task>>() {
            @Override
            public void onChanged(List<Task> tasks) {
                for(Task task : tasks){
                    if(task.getState().equals("0")) {
                        intask.add(task);
                        incompletedTasks.setTasks(intask);
                    } else{
                        comtask.add(task);
                        completedTasks.setTasks(comtask);
                    }
                }

                categories.add(incompletedTasks);
                categories.add(completedTasks);

                adapter.setCategory(categories);
            }
        });

ParentAdapter.java父适配器.java

public class TodayAdapter extends RecyclerView.Adapter<TodayAdapter.TodayHolder>{
    private List<TaskList> categories;

    public TodayAdapter(List<TaskList> todayLists) {
        this.categories = todayLists;
    }

    public TodayAdapter(Context context) {
        LayoutInflater mInflater = LayoutInflater.from(context);
    }


    @NonNull
    @Override
    public TodayHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new TodayAdapter.TodayHolder(itemView);    }

    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onBindViewHolder(@NonNull TodayHolder holder, int position) {
        Log.d("test", Integer.toString(categories.size()));
        if(categories!=null) {
            TaskList category = categories.get(position);
            holder.title.setText(category.getTitle());

            holder.tasks.setHasFixedSize(true);
            TaskAdapter taskAdapter = new TaskAdapter();
            taskAdapter.setTasks(category.getTasks());
            holder.tasks.setAdapter(taskAdapter);
            taskAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public int getItemCount() {
        if(categories!=null)
            return categories.size();
        return 0;
    }

    public class TodayHolder extends RecyclerView.ViewHolder {
        private TextView title;
        private RecyclerView tasks;
        public TodayHolder(@NonNull View itemView) {
            super(itemView);
            title=itemView.findViewById(R.id.title);
            tasks=itemView.findViewById(R.id.tasks);
        }
    }

    //Associates a list of tasks with this adapter
    public void setCategory(List<TaskList> categories) {
        this.categories = categories;
        notifyDataSetChanged();
    }
}

ChildAdapter.java ChildAdapter.java

/**
 * Adapter for the RecyclerView that displays a list of words.
 */

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskHolder> {

    private List<Task> tasks; // Cached copy of words
    private OnItemClickListener listener;

    public TaskAdapter(Context context) {
        LayoutInflater mInflater = LayoutInflater.from(context);
    }

    public TaskAdapter() {
    }

    @NonNull
    @Override
    public TaskHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.d("test","rani fe task adapder");

        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.task_item, parent, false);
        return new TaskHolder(itemView);
    }

    @SuppressLint("ResourceAsColor")
    @Override
    public void onBindViewHolder(@NonNull TaskHolder holder, int position) {
        Log.d("test","we are in =" +position);
        if (tasks != null) {
            Task currentTask = tasks.get(position);
            holder.textViewTitle.setText(currentTask.getTitle());
            holder.textViewDescription.setText(currentTask.getDescription());

            switch (currentTask.getCategory()) {
                case "1":
                    holder.layout.setBackgroundResource(R.color.button_beige);
                    if (currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_beige);
                    holder.textViewTitle.setPaintFlags(0);
                    holder.textViewDescription.setPaintFlags(0);
                    }else{
                        holder.view.setBackgroundResource(R.drawable.check_beige);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }
                    break;
                case "2":
                    holder.layout.setBackgroundResource(R.color.button_blue);

                    if(currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_blue);
                        holder.textViewTitle.setPaintFlags(0);
                        holder.textViewDescription.setPaintFlags(0);
                    }
                    else{
                        holder.view.setBackgroundResource(R.drawable.check_blue);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }
                    break;
                case "3":
                    holder.layout.setBackgroundResource(R.color.button_green);
                    if(currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_green);
                        holder.textViewTitle.setPaintFlags(0);
                        holder.textViewDescription.setPaintFlags(0);
                    }
                    else{
                        holder.view.setBackgroundResource(R.drawable.check_green);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }                    break;
                case "4":
                    holder.layout.setBackgroundResource(R.color.button_pink);
                    if(currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_pink);
                        holder.textViewTitle.setPaintFlags(0);
                        holder.textViewDescription.setPaintFlags(0);
                    }
                    else{
                        holder.view.setBackgroundResource(R.drawable.check_pink);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }
                    break;
                case "5":
                    holder.layout.setBackgroundResource(R.color.button_purple);
                    if(currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_purple);
                        holder.textViewTitle.setPaintFlags(0);
                        holder.textViewDescription.setPaintFlags(0);
                    }
                    else{
                        holder.view.setBackgroundResource(R.drawable.check_purple);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }
                    break;
                default:
                    holder.layout.setBackgroundResource(R.color.black);
                    if(currentTask.getState().equals("0")){
                        holder.view.setBackgroundResource(R.drawable.uncheck_black);
                        holder.textViewTitle.setPaintFlags(0);
                        holder.textViewDescription.setPaintFlags(0);
                    }
                    else{
                        holder.view.setBackgroundResource(R.drawable.check_black);
                        holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                        holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
                                | Paint.STRIKE_THRU_TEXT_FLAG);
                    }
                    break;
            }
        }
    }

    //getItemCount() is called many times, and when it is first called,
    //mWords has not been updated (means initially, it's null, and we can't return null).
    @Override
    public int getItemCount() {
        if (tasks != null)
            return tasks.size();
        return 0;
    }

    //Associates a list of tasks with this adapter
    public void setTasks(List<Task> tasks) {
        this.tasks = tasks;
        notifyDataSetChanged();
        if(tasks != null){
            Log.d("test","task size =" +this.tasks.size());
        }else Log.d("test","task size =" +0);
    }

    //to get the item from the id
    public Task getTaskAt(int position) {
        return tasks.get(position);
    }

    class TaskHolder extends RecyclerView.ViewHolder {
        private TextView textViewTitle;
        private TextView textViewDescription;
        private View view;
        private LinearLayout layout;
        private RelativeLayout EditLayout;

        public TaskHolder(@NonNull View itemView) {
            super(itemView);
            textViewTitle = itemView.findViewById(R.id.text_view_title);
            textViewDescription = itemView.findViewById(R.id.text_view_description);
            layout = itemView.findViewById(R.id.color);
            view = itemView.findViewById(R.id.image);
            EditLayout = itemView.findViewById(R.id.EditLayout);

            EditLayout.setOnClickListener(v -> {
                int position = getAdapterPosition();
                listener.onItemClick(tasks.get(position));
            });

            view.setOnClickListener(v -> {
                int position = getAdapterPosition();
                listener.onDoneClick(tasks.get(position));
            });
        }
    }

    public interface OnItemClickListener {
        void onItemClick(Task task);
        void onDoneClick(Task task);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}

That is because you must prefetch the child items first before you create its adapter using:这是因为您必须先预取子项,然后才能使用以下方法创建其适配器:

layoutManager.setInitialPrefetchItemCount(parentItem, .size()); layoutManager.setInitialPrefetchItemCount(parentItem, .size());

you can find a full tutorial in here你可以在这里找到完整的教程

https://www.geeksforgeeks.org/how-to-create-a-nested-recyclerview-in-android/ https://www.geeksforgeeks.org/how-to-create-a-nested-recyclerview-in-android/

I fix it by adding Linear Layout manager like this我通过像这样添加线性布局管理器来修复它

holder.tasks.setHasFixedSize(true);
ChildAdapter childAdapter = new ChildAdapter();
childAdapter.setList(category.getLists());

LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
holder.tasks.setLayoutManager(layoutManager);

holder.tasks.setAdapter(childAdapter);
childAdapter.notifyDataSetChanged();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM