如何实现一个SetOnItemClickListener FirebaseRecyclerViewAdapter [英] how to implement a SetOnItemClickListener FirebaseRecyclerViewAdapter
问题描述
如何在Firebase RecyclerView适配器中实现SetOnItemClickListener事件?
我使用文档,聊天应用程序的例子:
private FirebaseRecyclerViewAdapter mAdapter;
RecyclerView recycler =(RecyclerView)findViewById(R.id.messages_recycler);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(新的LinearLayoutManager(this));
mAdapter = new FirebaseRecyclerViewAdapter< ChatMessage,ChatMessageViewHolder>(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);
可能有很多方法可以做到这一点,是我刚刚尝试过的。
$ b
ChatMessageViewHolder
类有一个成员字段,每个聊天消息:
pre $ c $ public static class ChatHolder extends RecyclerView.ViewHolder {
View mView;
public ChatHolder(查看itemView){
super(itemView);
mView = itemView;
$ / code>
我们可以使用 mView
成员来访问可点击的视图。你应该为 mView
添加一个getter,但是我想尽量减少这里的变化。
那么在 populateView
中,我们可以使用具有额外的位置
参数的重载, OnClickListener
就像这样:
mRecycleViewAdapter = new FirebaseRecyclerAdapter< Chat,ChatHolder> ;(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());如果(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,你点了+位置);
mRecycleViewAdapter.getRef(position).removeValue();
}
});
}
};
这个问题的答案提供了许多灵感: RecyclerView onClick 。只要您可以确定用户点击的位置,就可以使用 mRecycleViewAdapter.getRef(position)
代码片段来获取被点击的项目的数据库引用。
更新
第二个想法我可能更喜欢这个答案 https://stackoverflow.com/a/26196831/209103 :
mMessages.addOnItemTouchListener(new RecyclerItemClickListener(this,new RecyclerItemClickListener.OnItemClickListener(){
@Override
public void onItemClick(View view,int position){
Log.w(TAG,您点击+位置;
mRecycleViewAdapter.getRef(position).removeValue();
}
}));
它使用 RecyclerItemClickListener
helper类答我链接。正如已经说过的那样:只要你有一个点击/触摸监听器告诉你所选项目的位置,其余的FirebaseUI方面将是相同的:call adapter.getRef(position )
获取所选项目的数据库引用。
how to implement a SetOnItemClickListener event in a Firebase RecyclerView Adapter? I use the example of documentation, chat app:
private FirebaseRecyclerViewAdapter mAdapter;
RecyclerView recycler = (RecyclerView) findViewById(R.id.messages_recycler);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new FirebaseRecyclerViewAdapter<ChatMessage, ChatMessageViewHolder>(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);
There are probably many ways to do this, but this is the one I just quickly tried.
The ChatMessageViewHolder
class has a member field where it keeps the root view for each chat message:
public static class ChatHolder extends RecyclerView.ViewHolder {
View mView;
public ChatHolder(View itemView) {
super(itemView);
mView = itemView;
}
We can use that mView
member to get access to the clickable view. You should add a getter for mView
, but I'm trying to minimize the changes here.
So then in populateView
we can use the overload that has an additional position
parameter and wire things up with an OnClickListener
like this:
mRecycleViewAdapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(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();
}
});
}
};
The answers to this question offer tons of inspiration: RecyclerView onClick. As long as you can determine the position that the user clicked on, you can use the mRecycleViewAdapter.getRef(position)
snippet to get the database reference of the item that was clicked.
Update
On second thought I might like this answer better https://stackoverflow.com/a/26196831/209103:
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();
}
}));
It uses the RecyclerItemClickListener
helper class from the answer I linked. And as already said: as long as you have a click/touch listener that tells you the position of the item that was selected, the rest FirebaseUI aspect of it will be the same: call adapter.getRef(position)
to get a database reference for the selected item.
这篇关于如何实现一个SetOnItemClickListener FirebaseRecyclerViewAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!