如何在Firebase RecyclerView适配器中实现SetOnItemClickListener事件?我使用文档示例,聊天应用程序:
private FirebaseRecyclerViewAdapter mAdapter; RecyclerView recycler = (RecyclerView) findViewById(R.id.messages_recycler); recycler.setHasFixedSize(true); recycler.setLayoutManager(new LinearLayoutManager(this)); mAdapter = new FirebaseRecyclerViewAdapter(ChatMessage.class, android.R.layout.two_line_list_item, ChatMessageViewHolder.class, mRef) { @Override public void populateViewHolder(ChatMessageViewHolder chatMessageViewHolder, ChatMessage chatMessage) { chatMessageViewHolder.nameText.setText(chatMessage.getName()); chatMessageViewHolder.messageText.setText(chatMessage.getMessage()); } }; recycler.setAdapter(mAdapter);
Frank van Pu.. 15
可能有很多方法可以做到这一点,但这是我很快就尝试过的方法.
所述ChatMessageViewHolder
类具有其中它保持每个聊天消息根视图成员字段:
public static class ChatHolder extends RecyclerView.ViewHolder { View mView; public ChatHolder(View itemView) { super(itemView); mView = itemView; }
我们可以使用该mView
成员来访问可点击的视图.你应该添加一个getter mView
,但我正在尝试最小化这里的更改.
那么populateView
我们可以使用具有附加position
参数的重载并将其连接起来,OnClickListener
如下所示:
mRecycleViewAdapter = new FirebaseRecyclerAdapter(Chat.class, R.layout.message, ChatHolder.class, mChatRef) { @Override public void populateViewHolder(ChatHolder chatView, Chat chat, final int position) { chatView.setName(chat.getName()); chatView.setText(chat.getText()); if (mAuthData != null && chat.getUid().equals(mAuthData.getUid())) { chatView.setIsSender(true); } else { chatView.setIsSender(false); } chatView.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.w(TAG, "You clicked on "+position); mRecycleViewAdapter.getRef(position).removeValue(); } }); } };
这个问题的答案提供了大量的灵感:RecyclerView onClick.只要您可以确定用户单击的位置,就可以使用该mRecycleViewAdapter.getRef(position)
代码段获取所单击项目的数据库引用.
第二个想法我可能更喜欢这个答案/sf/ask/17360801/:
mMessages.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.w(TAG, "You clicked on "+position); mRecycleViewAdapter.getRef(position).removeValue(); } }));
它使用RecyclerItemClickListener
我链接的答案中的助手类.正如已经说过的那样:只要你有一个点击/触摸监听器告诉你所选项目的位置,它的其余FirebaseUI方面将是相同的:调用adapter.getRef(position)
以获取所选项目的数据库引用.
可能有很多方法可以做到这一点,但这是我很快就尝试过的方法.
所述ChatMessageViewHolder
类具有其中它保持每个聊天消息根视图成员字段:
public static class ChatHolder extends RecyclerView.ViewHolder { View mView; public ChatHolder(View itemView) { super(itemView); mView = itemView; }
我们可以使用该mView
成员来访问可点击的视图.你应该添加一个getter mView
,但我正在尝试最小化这里的更改.
那么populateView
我们可以使用具有附加position
参数的重载并将其连接起来,OnClickListener
如下所示:
mRecycleViewAdapter = new FirebaseRecyclerAdapter(Chat.class, R.layout.message, ChatHolder.class, mChatRef) { @Override public void populateViewHolder(ChatHolder chatView, Chat chat, final int position) { chatView.setName(chat.getName()); chatView.setText(chat.getText()); if (mAuthData != null && chat.getUid().equals(mAuthData.getUid())) { chatView.setIsSender(true); } else { chatView.setIsSender(false); } chatView.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.w(TAG, "You clicked on "+position); mRecycleViewAdapter.getRef(position).removeValue(); } }); } };
这个问题的答案提供了大量的灵感:RecyclerView onClick.只要您可以确定用户单击的位置,就可以使用该mRecycleViewAdapter.getRef(position)
代码段获取所单击项目的数据库引用.
第二个想法我可能更喜欢这个答案/sf/ask/17360801/:
mMessages.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.w(TAG, "You clicked on "+position); mRecycleViewAdapter.getRef(position).removeValue(); } }));
它使用RecyclerItemClickListener
我链接的答案中的助手类.正如已经说过的那样:只要你有一个点击/触摸监听器告诉你所选项目的位置,它的其余FirebaseUI方面将是相同的:调用adapter.getRef(position)
以获取所选项目的数据库引用.