java - 为什么我的 RecyclerView 不显示我的适配器项目?
问题描述
所以我有一个回收器视图,旨在显示用户从我的 Firebase RTD 相互发送消息。最初它正在显示所有用户,然后单击回收器项目,然后它将显示用户之间的消息。但是,当将其修改为仅查看与当前用户处于打开消息中的用户时,填充我的回收站视图的项目不再显示,并且E/RecyclerView: No adapter attached; skipping layout
在“运行”选项卡中记录了一条错误消息。
不幸的是,我无法再撤消更改并且一直在努力寻找问题的原因,但假设它发生在我的改编课程或活动课程中。
收件箱活动.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()
推荐阅读
- python - SARIMA 模型的局限性 - 挑战
- python - 如果语句不正确,如何在最后的字典中添加一个数字
- javascript - 有没有办法修改文本中每个字母的大小?
- r - 当 A 列中的值与 R 中的第二个数据文件相遇时,提取 B 列的值
- c++ - 致命错误:找不到“openssl/evp.h”文件 cmake + make
- java - 为 Java 编辑 PATH
- jsf - 如何从自定义 JSF 输入组件中获取提交的值?
- memory - 在 Forth 中使用 HERE 作为临时空间
- r - 使用 POSIXct 将日期转换存储为数字列表而不是日期格式
- azure-batch - 自定义共享库中的 VM 映像以批量使用