java - 我收到一个错误 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 之外调用适配器,因为我希望它在用户仅与某人聊天时发生,但我尝试与某人聊天并查看聊天列表,仍然没有。
解决方案
试试这个代码。
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) {
}
});
}
推荐阅读
- php - 在 WordPress 快速编辑中显示自定义元
- python - 具有重复 ID 的欧几里得距离
- python - 两个不同容器内的 2 个 API 之间的通信
- vue.js - 在Vue中,从孩子>父母>更高父母传递数据的最佳方式是什么?
- flutter - 在 AlertDialog 中获取复选框
- python - 我有这段代码,试图通过捕获视频来运行社会隔离识别,但我有这个错误。你可以帮帮我吗?
- javascript - 从three.js场景中获取像素颜色值
- oauth - 登录后,WebChat OAuth SSO 不会继续对话流
- matlab - 如何使用 ODE45 使用输入 u 进行模拟 - MATLAB
- javascript - Snipcart 购物车未正确更新