繁体   English   中英

为什么我的 RecyclerView 不显示我的适配器项目?

[英]Why isn't my RecyclerView displaying my adapter items?

所以我有一个回收器视图,旨在显示用户从我的 Firebase RTD 相互发送消息。 最初它正在显示所有用户,然后单击回收器项目,然后它将显示用户之间的消息。 但是,当将其修改为仅查看与当前用户处于打开消息中的用户时,填充我的回收器视图的项目不再显示,并显示错误E/RecyclerView: No adapter attached; skipping layout E/RecyclerView: No adapter attached; skipping layout记录在“运行”选项卡中。

不幸的是,我无法再撤消更改并且一直在努力寻找问题的原因,但假设它发生在我的改编课程或活动课程中。

收件箱Activity.java:

public class InboxActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private List<User> inboxLst;

    FirebaseUser user;
    DatabaseReference reference;

    UserAdapter usrAdpt;

    private List<String> userLst;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_inbox);

        //Identify and setup recycler view
        recyclerView = findViewById(R.id.rycInbox);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));


        userLst = new ArrayList<>();

        //Get all chats between current user and and other users
        user = FirebaseAuth.getInstance().getCurrentUser();
        reference = FirebaseDatabase.getInstance().getReference("Chats");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                userLst.clear();

                for (DataSnapshot snp : dataSnapshot.getChildren()){
                    Chat chat = snp.getValue(Chat.class);
                    if (chat.getSender().equals(user.getUid())){
                        userLst.add(chat.getReceiver());
                    }
                    if (chat.getReceiver().equals(user.getUid())){
                        userLst.add(chat.getSender());
                    }
                }
                readChat();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readChat() {
        inboxLst = new ArrayList<>();

        reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                userLst.clear();
                for (DataSnapshot snp : dataSnapshot.getChildren()) {
                    User usr = snp.getValue(User.class);

                    //Display users that are currently in an open chat
                    for (String id : userLst){
                        if(usr.getId().equals(id)){
                            if(inboxLst.size() != 0){
                                for (User usrl : inboxLst){
                                    if(!usr.getId().equals(usrl.getId())){
                                        inboxLst.add(usr);
                                    }
                                }
                            }else{
                                inboxLst.add(usr);
                            }
                        }
                    }
                }
                //Set the adapter for the recycler view once using the chat information retrieved from firebase database
                usrAdpt = new UserAdapter(InboxActivity.this,inboxLst);
                recyclerView.setAdapter(usrAdpt);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { }
        });
    }
}

用户适配器.java:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {

    private Context cont;
    private List<User> nUser;

    public UserAdapter(Context cont, List<User> nUser){
        this.cont = cont;
        this.nUser = nUser;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(cont).inflate(R.layout.lst_layout_inbox, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        User user = nUser.get(position);
        holder.username.setText(user.getUsername());

        holder.usrLst.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(cont, MessageActivity.class);
                intent.putExtra("userid",user.getId());
                cont.startActivity(intent);
            }
        });

    }


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

    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView username;
        RelativeLayout usrLst;

        public ViewHolder(View itemView){
            super(itemView);

            username = itemView.findViewById(R.id.usrName);
            usrLst = itemView.findViewById(R.id.usrCard);
        }
    }
}

您问题中唯一的补充是,采用以下方法:

     @Override
     public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
         userLst.clear(); // <------ WHY YOU CLEAR LIST HERE??? COMMENT THIS ----------
         for (DataSnapshot snp : dataSnapshot.getChildren()) {
             User usr = snp.getValue(User.class);

              //Display users that are currently in an open chat
              for (String id : userLst){
                  if(usr.getId().equals(id)){
                      if(inboxLst.size() != 0){
                          for (User usrl : inboxLst){
                              if(!usr.getId().equals(usrl.getId())){
                                  inboxLst.add(usr);
                               }
                           }
                       }else{
                           inboxLst.add(usr);
                       }
                   }
               }
            }
            //Set the adapter for the recycler view once using the chat information retrieved from firebase database
            usrAdpt = new UserAdapter(InboxActivity.this,inboxLst);
            recyclerView.setAdapter(usrAdpt);
       }

为什么你做userLst.clear(); ?

由于在OnCreate()方法中填充userLst并调用readChat() onDataChange()中,您清除userLst ,然后尝试遍历userLst以显示当前处于打开聊天状态的用户。

我建议评论这个userLst.clear(); 并在设置项目后调用notifyDataSetChanged()

试试这些东西:

  • 在 onCreate 中设置适配器。
  • 在 onDataChanged 监听器中,更新 ArrayList 并调用 notifyDataSetChanged()。

这应该有帮助

暂无
暂无

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

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