首页 > 解决方案 > 我收到一个错误 E/RecyclerView: No adapter attach; 跳过布局

问题描述

它发生在这门课上,我没有尝试太多,所以我对想法持开放态度,我试图让它成为用户与他们看到的用户聊天的地方,他们的聊天最终出现在一个聊天列表片段中。

public class ChatListFragment extends Fragment {


    RecyclerView mRecyclerView;
    List<ModelChatList> chatListList;
    List<ModelUsers> userList;
    DatabaseReference reference;
    FirebaseUser currentUser;

    AdapterChatList mAdapterChatList;


    public ChatListFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_chat_list, container, false);

        currentUser = FirebaseAuth.getInstance().getCurrentUser();



        mRecyclerView = view.findViewById(R.id.recyclerView);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        chatListList = new ArrayList<>();

        reference = FirebaseDatabase.getInstance().getReference("ChatList").child(currentUser.getUid());
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                chatListList.clear();
                for (DataSnapshot ds: dataSnapshot.getChildren()){
                    ModelChatList chatlist = ds.getValue(ModelChatList.class);
                    chatListList.add(chatlist);


                }
                loadChats();
            }

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

            }
        });
        // Inflate the layout for this fragment
        return view;


    }

    private void loadChats() {
        userList = new ArrayList<>();
        reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                userList.clear();
                for (DataSnapshot ds: dataSnapshot.getChildren()){
                    ModelUsers user = ds.getValue(ModelUsers.class);

                    for(ModelChatList chatlist: chatListList){
                        if(user.getUid() != null && user.getUid().equals(chatlist.getId())){
                            userList.add(user);
                            break;
                        }
                    }

                    //adapter
                    mAdapterChatList = new AdapterChatList(getContext(), userList);

                    mRecyclerView.setAdapter(mAdapterChatList);

                    for(int i=0; i<userList.size(); i++){
                        lastMessage(userList.get(i).getUid());
                    }
                }
            }

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

            }
        });
    }

适配器代码

package com.search.search.adapters;

import android.content.Context;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.search.search.R;
import com.search.search.models.ModelChat;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.squareup.picasso.Picasso;

import java.util.Calendar;
import java.util.List;
import java.util.Locale;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class AdapterChat extends RecyclerView.Adapter<AdapterChat.MyHolder>{

    private static final int MSG_TYPE_LEFT = 0;
    private static final int MSG_TYPE_RIGHT = 1;
    Context context;
    List<ModelChat> chatList;
    String imageUrl;

    FirebaseUser fUser;

    public AdapterChat(Context context, List<ModelChat> chatList, String hisImage) {
        this.context = context;
        this.chatList = chatList;
        this.imageUrl = hisImage;
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        if(i==MSG_TYPE_RIGHT){
            View view = LayoutInflater.from(context).inflate(R.layout.row_chat_right, viewGroup, false);
            return new MyHolder(view);
        } else {
            View view = LayoutInflater.from(context).inflate(R.layout.row_chat_left, viewGroup, false);
            return new MyHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder myHolder, int i) {
        String message = chatList.get(i).getMessage();
        String timeStamp = chatList.get(i).getTimestamp();

        Calendar cal = Calendar.getInstance(Locale.ENGLISH);
        cal.setTimeInMillis(Long.parseLong(timeStamp));
        String dateTime = DateFormat.format("dd/MM/yyyy hh:mm aa", cal).toString();

        myHolder.messageTv.setText(message);
        myHolder.timeTv.setText(dateTime);
        try {
            Picasso.get().load(imageUrl).into(myHolder.profileIv);

        } catch (Exception e){

        }

        if(i==chatList.size() - 1){
            if(chatList.get(i).isSeen()) {
                myHolder.isSeenTv.setText("Seen");
            }else {
                myHolder.isSeenTv.setText("Delivered");

            }
        } else {
            myHolder.isSeenTv.setVisibility(View.GONE);
        }
    }

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


    public int getItemViewType(int position){
        fUser = FirebaseAuth.getInstance().getCurrentUser();
        if(chatList.get(position).getSender().equals(fUser.getUid())){
            return MSG_TYPE_RIGHT;
        }

        else {
            return MSG_TYPE_LEFT;
        }
    }


    class MyHolder extends RecyclerView.ViewHolder{


        ImageView profileIv;
        TextView messageTv, timeTv, isSeenTv;

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

            profileIv = itemView.findViewById(R.id.profileImageIv);
            messageTv = itemView.findViewById(R.id.messageTv);
            timeTv = itemView.findViewById(R.id.dateTv);
            isSeenTv = itemView.findViewById(R.id.isSeenTv);
        }

    }



}

我也尝试过查找此问题的答案,但我找不到任何东西

我在 oncreate 之外调用适配器,因为我希望它在用户仅与某人聊天时发生,但我尝试与某人聊天并查看聊天列表,仍然没有。

标签: javaandroidandroid-recyclerview

解决方案


试试这个代码。

public class ChatListFragment extends Fragment {


RecyclerView mRecyclerView;
List<ModelChatList> chatListList;
List<ModelUsers> userList;
DatabaseReference reference;
FirebaseUser currentUser;

AdapterChatList mAdapterChatList;


public ChatListFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_chat_list, container, false);

    currentUser = FirebaseAuth.getInstance().getCurrentUser();



    mRecyclerView = view.findViewById(R.id.recyclerView);

    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    chatListList = new ArrayList<>();
  //adapter
    mAdapterChatList = new AdapterChatList(getContext(), userList);
    mRecyclerView.setAdapter(mAdapterChatList);
    reference = FirebaseDatabase.getInstance().getReference("ChatList").child(currentUser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            chatListList.clear();
            for (DataSnapshot ds: dataSnapshot.getChildren()){
                ModelChatList chatlist = ds.getValue(ModelChatList.class);
                chatListList.add(chatlist);


            }
            loadChats();
        }

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

        }
    });
    // Inflate the layout for this fragment
    return view;


}

private void loadChats() {
    userList = new ArrayList<>();
    reference = FirebaseDatabase.getInstance().getReference("Users");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            userList.clear();
            for (DataSnapshot ds: dataSnapshot.getChildren()){
                ModelUsers user = ds.getValue(ModelUsers.class);

                for(ModelChatList chatlist: chatListList){
                    if(user.getUid() != null && user.getUid().equals(chatlist.getId())){
                        userList.add(user);
                        break;
                    }
                }

          mAdapterChatList.notifyDataSetChanged()

                for(int i=0; i<userList.size(); i++){
                    lastMessage(userList.get(i).getUid());
                }
            }
        }

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

        }
    });
}

推荐阅读