首页 > 解决方案 > 如何使用 ArrayList 将数据从模型类正确传输到 RecyclerAdapter 类(从 Firebase 实时数据库中检索数据)

问题描述

我正在尝试使用从 Firebase 实时数据库中检索到的数据将未确定数量的 viewHolders 加载到 recyclerView 中。这是用于我的 Android 应用程序的消息传递组件。我首先遍历存储在当前用户的用户 ID 下的数据库中的聊天键列表(请参阅下面的“聊天键”节点)。对于每个键,我访问特定的关联聊天(请参阅下面的“聊天基础”节点)。出于测试目的,我只检索和设置一种值类型(“lastMessage”),但是我打算在成功测试后为每个 viewHolder 设置多个值。我不确定如何正确地将每次迭代存储在模型类中的数据传递给适配器类中的 onBindViewHolder,以便在各个视图中显示。

我已经成功地为我的片段类中的每次迭代检索“lastMessage”,然后为每次迭代将一个字符串传递给我的适配器类。viewHolders 确实显示了正确的字符串值。虽然我可以成功地做到这一点,但我需要能够为每次迭代传递一个数据数组列表,这样我就不限于每个键只传递一个值。因为适配器类中的 onBindViewHolder 是位置相关的,所以我的理解是我不能简单地传递带有简单字符串的数组列表,而是应该在 arrayList 中传递模型类的实例(OOC - 可能不是正确的词)在适配器类中进一步访问。

一种或另一种方式,请帮助我根据下面提供的代码将一组值加载到每个 Firebase 数据库聊天键迭代的未确定数量的 viewHolders 中。干杯。

型号类:

public class MessagesList {

private String lastMessage;

//Default constructor
public MessagesList() {
}

public MessagesList(String lastMessage) {//String userName,, String profileImage) {

    //this.userName = userName;
    this.lastMessage = lastMessage;
    //this.profileImage = profileImage;
}

public String getLastMessage() {
    return lastMessage;
}

public void setLastMessage(String lastMessage) {
    this.lastMessage = lastMessage;
}

}

适配器类:

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

private ItemClickListener mClickListener;
private LayoutInflater mInflater;

private ArrayList<MessagesList> mList;

//Data is passed into the constructor
public TestRecyclerViewAdapter(Context context, ArrayList<MessagesList> messagesList) {
    this.mInflater = LayoutInflater.from(context);
    this.mList = messagesList;
}

//Inflates the row layout from xml when needed
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.standard_chat_list_layout, parent, false);
    return new ViewHolder(view);
}

//Binds the data to the TextView in each row
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

holder.chatListLastMessage.setText(mList.get(position).getLastMessage());
        
}

//Total number of rows
@Override
public int getItemCount() {
    return 0;
}

// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView chatListLastMessage;

    ViewHolder(View itemView) {
        super(itemView);

        chatListLastMessage = itemView.findViewById(R.id.chatListLastMessage);

    }

    @Override
    public void onClick(View view) {
        if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
    }
}

// allows clicks events to be caught
void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}

}

相关片段:

public class MessagingFragment1 extends Fragment {

private DatabaseReference databaseReference;//, personalChatReference;

private RecyclerView directMessageRecycler;

private String currentUserID;

private TestRecyclerViewAdapter adapter;

private ArrayList<MessagesList> list_of_groups = new ArrayList<>();

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


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_messaging1, container, false);

    currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    directMessageRecycler = rootView.findViewById(R.id.directMessageRecycler);

    //directMessageRecycler.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    directMessageRecycler.setLayoutManager(linearLayoutManager);

    //get a reference to the join table mentioned above
    databaseReference.child("Chat Keys").child(currentUserID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                String groupId = (snapshot.getKey());

                databaseReference.child("Chat Basics").child(groupId).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshotInner) {

                        MessagesList messagesList = dataSnapshotInner.getValue(MessagesList.class);

                        list_of_groups.add(messagesList);

                        adapter = new TestRecyclerViewAdapter(getActivity(), list_of_groups);
                        directMessageRecycler.setAdapter(adapter);
                        //adapter.setClickListener();

                    }

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

                    }
                });

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
return rootView;

}

数据库结构(x2): 聊天键数据库节点

聊天基础数据库节点

标签: javaandroidfirebase-realtime-databasearraylistandroid-recyclerview

解决方案


原来我只是忘了返回正确的项目数

 //Total number of rows
@Override
public int getItemCount() {
    return mList.size();
}

结果是一个空白的recyclerView。尽管发布此问题的原因很愚蠢,但我仍将其作为其他人(例如我)的示例,以供他们难以找到一个简洁完整的示例,说明如何使用一个节点中的简单密钥标识符从 Firebase 数据库中检索数据在另一个节点中找到核心数据


推荐阅读