如何实现SetOnItemClickListener FirebaseRecyclerViewAdapter

Jon*_*lli 9 android firebase firebase-realtime-database firebaseui

如何在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, 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);
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 15

可能有很多方法可以做到这一点,但这是我很快就尝试过的方法.

所述ChatMessageViewHolder类具有其中它保持每个聊天消息根视图成员字段:

public static class ChatHolder extends RecyclerView.ViewHolder {
    View mView;

    public ChatHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }
Run Code Online (Sandbox Code Playgroud)

我们可以使用该mView成员来访问可点击的视图.你应该添加一个getter mView,但我正在尝试最小化这里的更改.

那么populateView我们可以使用具有附加position参数的重载并将其连接起来,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());

            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();                        
                }
            });
        }
    };
Run Code Online (Sandbox Code Playgroud)

这个问题的答案提供了大量的灵感:RecyclerView onClick.只要您可以确定用户单击的位置,就可以使用该mRecycleViewAdapter.getRef(position)代码段获取所单击项目的数据库引用.

更新

第二个想法我可能更喜欢这个答案/sf/answers/1833778201/:

    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();
        }
    }));
Run Code Online (Sandbox Code Playgroud)

它使用RecyclerItemClickListener我链接的答案中的助手类.正如已经说过的那样:只要你有一个点击/触摸监听器告诉你所选项目的位置,它的其余FirebaseUI方面将是相同的:调用adapter.getRef(position)以获取所选项目的数据库引用.

  • 添加"Firebase RecyclerView Adapter"类的方法是"get Item(position)",它返回相关对象.在上面的例子中放入onClick:String myString = getItem(itemPosition); (4认同)