Почему мой RecyclerView не отображает элементы моего адаптера? - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня есть вид рециркулятора, который предназначен для показа пользователям, отправляющим сообщения друг другу с моего Firebase RTD. Первоначально он работал, чтобы показать всех пользователей, и пункты рециркуляции были нажаты, тогда это показывало бы сообщения между пользователями. Однако при его изменении для просмотра только тех пользователей, которые находились в открытых сообщениях с текущим пользователем, элементы, заполнившие мое представление рециркулятора, больше не отображаются, и на вкладке «Выполнить» регистрируется ошибка «1001 *».

К сожалению, я больше не могу отменить изменения и изо всех сил пытался найти причину моей проблемы, но предположил, что это происходит в моих адаптированных или классах деятельности.

InboxActivity. 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) { }
        });
    }
}

UserAdapter. 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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Единственный ответ на ваш вопрос в следующем методе:

     @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()

0 голосов
/ 08 апреля 2020

Попробуйте выполнить следующие действия:

  • Установите адаптер в onCreate.
  • и в слушателе onDataChanged обновите ArrayList и вызовите notifyDataSetChanged ().

Это должно помочь

...