10

如何在 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);
4

2 回答 2

17

可能有很多方法可以做到这一点,但这是我刚刚快速尝试过的一种。

该类ChatMessageViewHolder有一个成员字段,它保留每个聊天消息的根视图:

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

    public ChatHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

我们可以使用该mView成员来访问可点击视图。您应该为 添加一个吸气剂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();                        
                }
            });
        }
    };

这个问题的答案提供了大量的灵感: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, "You clicked on "+position);
            mRecycleViewAdapter.getRef(position).removeValue();
        }
    }));

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

于 2015-12-06T01:49:25.513 回答
2

这是我的解决方案。这对我有用

ViewHolder 类

public class StudentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView textViewName;
public TextView textViewRoll;
public TextView textViewAge;


public MyViewHolderClickListener mListener;

private String TAG= getClass().getSimpleName();

public static interface MyViewHolderClickListener{

    public void onTextViewNameClick(View view, int position);
    public void onTextViewRollClick(View view, int position);
}

public StudentViewHolder(View itemView) {
    super(itemView);
    textViewName = (TextView) itemView.findViewById(R.id.textViewName);
    textViewRoll = (TextView) itemView.findViewById(R.id.textViewRoll);
    textViewAge = (TextView) itemView.findViewById(R.id.textViewAge);

    textViewName.setOnClickListener(this);
    textViewRoll.setOnClickListener(this);
}


public void bindToStudent(Student student){
    if (student == null) {
        return;
    }

    textViewName.setText("Name: " +  student.getName());
    textViewRoll.setText( "Roll: " + student.getRoll());
    textViewAge.setText( "Age: " +  student.getAge());
}

public void setCustomOnClickListener(MyViewHolderClickListener listener  ){
    this.mListener = listener;
}

@Override
public void onClick(View view) {

    Log.d(TAG, "onClick at " + getAdapterPosition());
    Log.d(TAG, "id: " + view.getId());

    if( mListener!= null ){
        switch (view.getId()) {
            case R.id.textViewName:
                mListener.onTextViewNameClick(view, getAdapterPosition());
                break;
            case R.id.textViewRoll:
                mListener.onTextViewRollClick(view, getAdapterPosition());
                break;

            default:
                break;
        }

    }

 }



}

适配器类

public class StudentListAdapter extends FirebaseRecyclerAdapter<Student, StudentViewHolder> {

Activity parentActivity;
StudentViewHolder.MyViewHolderClickListener myViewHolderClickListener;

private String TAG = getClass().getSimpleName();

public StudentListAdapter(Activity mActivity, Class<Student> modelClass, int modelLayout, Class<StudentViewHolder> viewHolderClass, Query ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    parentActivity = mActivity;
}


@Override
public StudentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    StudentViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
    // adding my MyViewHolderClickListener here
    viewHolder.setCustomOnClickListener(myViewHolderClickListener);
    return viewHolder;
}

@Override
protected void populateViewHolder(StudentViewHolder viewHolder, final Student model, final int position) {

    Log.d(TAG, model.toString());
    Log.d(TAG, getRef(position).getKey());

    // bind view
    viewHolder.bindToStudent(model);
}


public void setMyViewHolderClickListener(StudentViewHolder.MyViewHolderClickListener listener){
    this.myViewHolderClickListener = listener;
}


}

在活动课上

        mAdapter = new StudentListAdapter(this, Student.class, R.layout.list_item, StudentViewHolder.class, studentQuery);
    mAdapter.setMyViewHolderClickListener(new StudentViewHolder.MyViewHolderClickListener() {
        @Override
        public void onTextViewNameClick(View view, int position) {
            Log.d(TAG, "Name Click at " +position);
        }

        @Override
        public void onTextViewRollClick(View view, int position) {
            Log.d(TAG, "Roll Click at " +position);
        }
    });

    recyclerView.setAdapter(mAdapter);
于 2016-10-19T14:33:45.130 回答