E/RecyclerView:没有附加适配器;跳过布局——制作待办事项列表应用程序时 [英] E/RecyclerView: No adapter attached; skipping layout -- when making a todo list app

查看:22
本文介绍了E/RecyclerView:没有附加适配器;跳过布局——制作待办事项列表应用程序时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

public class ToDoAdapter extends RecyclerView.Adapter{上下文上下文;ArrayList待办事项;公共 ToDoAdapter(上下文 c,ArrayList p){上下文 = c;toDoItems = p;}@非空@覆盖公共 MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {返回新的 MyViewHolder(LayoutInflater.from(context).inflate(R.layout.front_page_layout, viewGroup, false));}@覆盖public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {myViewHolder.itemTitle.setText(toDoItems.get(i).getItemTitle());myViewHolder.itemSubject.setText(toDoItems.get(i).getItemSubject());myViewHolder.itemDueDate.setText(toDoItems.get(i).getItemDueDate());}@覆盖公共 int getItemCount() {返回到DoItems.size();}类 MyViewHolder 扩展 RecyclerView.ViewHolder {TextView itemTitle;TextView itemSubject;TextView itemDueDate;public MyViewHolder(@NonNull View itemView) {超级(项目视图);itemTitle = itemView.findViewById(R.id.itemTitle);itemSubject = itemView.findViewById(R.id.itemSubject);itemDueDate = itemView.findViewById(R.id.itemDueDate);}}}

我的 Main.class 文件

//处理数据mainPageRecyclerView = findViewById(R.id.mainPageRecyclerView);mainPageRecyclerView.setLayoutManager(new LinearLayoutManager(this));list = new ArrayList();addNewTask.setOnClickListener(new View.OnClickListener() {@覆盖public void onClick(View v) {Intent a = new Intent(MainActivity.this,NewTaskAct.class);开始活动(一);}});//从firebase获取数据dbReference = FirebaseDatabase.getInstance().getReference().child("to-do-list");dbReference.addValueEventListener(new ValueEventListener() {@覆盖public void onDataChange(@NonNull DataSnapshot dataSnapshot) {//设置代码以检索数据并替换布局for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){ToDoItems p = dataSnapshot1.getValue(ToDoItems.class);list.add(p);}toDoAdapter = new ToDoAdapter(MainActivity.this, list);mainPageRecyclerView.setAdapter(toDoAdapter);toDoAdapter.notifyDataSetChanged();}

我可以看到 firebase 数据库中的数据,但它不会从数据库中拉回信息,我只是在 android studio RUN 中收到以下错误 --> E/RecyclerView:没有附加适配器;跳过布局作为学习的一部分,我正在编写一个简单的应用程序,我可以将信息写入 firebase,但是当我的应用程序更改视图并需要从数据库调用数据时,我不断收到上述错误

我有 youtube'd 并查看了其他堆栈溢出问题,但我无法理解适用于我的项目的解决方案

解决方案

您的 Recyclerview 被跳过,因为在绘制布局时没有附加适配器.您当前正在从事件回调设置适配器,该事件回调在布局已经绘制并且已跳过 Recyclerview 后仍将返回.您需要直接在您的活动的 onCreate 中调用 setAdapter() 然后更新适配器的数据,确保在您的事件回调中调用 notifydatasetchanged.>

在您的活动的 onCreate 中:

//创建一个空的适配器,因为你没有初始数据//(您可能需要更改 Adapter 类的构造函数//防止它尝试处理空/空数据,这样它就不会中断)MyAdapter myAdapter = new MyAdapter(null);//设置 Recyclerview 的适配器,这样它就不会在布局过程中被跳过myRecyclerView.setAdapter(myAdapter);

然后,在您的事件回调中:

//使用您在适配器中定义的更新函数用新数据更新您的适配器myAdapter.updateData(myNewData);//通知 Adapter 数据发生变化myAdapter.notifyDataSetChanged();

public class ToDoAdapter extends RecyclerView.Adapter<ToDoAdapter.MyViewHolder> {

    Context context;
    ArrayList<ToDoItems> toDoItems;


    public ToDoAdapter(Context c, ArrayList<ToDoItems> p) {
        context = c;
        toDoItems = p;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.front_page_layout, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
        myViewHolder.itemTitle.setText(toDoItems.get(i).getItemTitle());
        myViewHolder.itemSubject.setText(toDoItems.get(i).getItemSubject());
        myViewHolder.itemDueDate.setText(toDoItems.get(i).getItemDueDate());

    }

    @Override
    public int getItemCount() {
        return toDoItems.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView itemTitle;
        TextView itemSubject;
        TextView itemDueDate;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            itemTitle = itemView.findViewById(R.id.itemTitle);
            itemSubject = itemView.findViewById(R.id.itemSubject);
            itemDueDate = itemView.findViewById(R.id.itemDueDate);

        }
    }

}

My Main.class file

       //Working with data
            mainPageRecyclerView = findViewById(R.id.mainPageRecyclerView);
            mainPageRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            list = new ArrayList<ToDoItems>();


            addNewTask.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent a = new Intent(MainActivity.this,NewTaskAct.class);
                    startActivity(a);
                }
            });

            //get data from firebase
            dbReference = FirebaseDatabase.getInstance().getReference().child("to-do-list");
            dbReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    //set code to retrieve data and replace layout
                    for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                    {
                        ToDoItems p = dataSnapshot1.getValue(ToDoItems.class);
                        list.add(p);
                    }
                    toDoAdapter = new ToDoAdapter(MainActivity.this, list);
                    mainPageRecyclerView.setAdapter(toDoAdapter);
                    toDoAdapter.notifyDataSetChanged();
                }

I can see the data in the firebase database but it will not pull the information back from the database and i just get the following error in android studio RUN --> E/RecyclerView: No adapter attached; skipping layout I am writing a simple to do app as part of my learning and i can write information to firebase but i keep getting the above error when my app changes views and needs to call data from the database

I have youtube'd and looked through other stack overflow questions but I can't understand a solution that will work with my project

解决方案

Your Recyclerview is being skipped because there is no adapter attached to it when the layout is drawn. You're currently setting the adapter from an event callback which will still return after the layout is already drawn and the Recyclerview has been skipped. You need to call setAdapter() directly in your Activity's onCreate then update the adapter's data making sure to call notifydatasetchanged in your event callback.

Inside your activity's onCreate:

// Create an empty adapter since you don't have initial data
// (You may need to alter the constructor of your Adapter class 
//  to keep it from trying to process empty/null data so it doesn't break)
MyAdapter myAdapter = new MyAdapter(null);

// Set the Recyclerview's Adapter so it isn't skipped on the layout pass
myRecyclerView.setAdapter(myAdapter);

Then, inside your event callback:

// Update your Adapter with the new data using an update function you define in your Adapter
myAdapter.updateData(myNewData);

// Notify the Adapter that the data has changed
myAdapter.notifyDataSetChanged();

这篇关于E/RecyclerView:没有附加适配器;跳过布局——制作待办事项列表应用程序时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆