Как реализовать SetOnItemClickListener FirebaseRecyclerViewAdapter

Как реализовать событие SetOnItemClickListener в адаптере Firebase RecyclerView? Я использую пример документации, приложение для чата:

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); 

Вероятно, есть много способов сделать это, но это тот, который я только что попробовал.

Класс ChatMessageViewHolder имеет поле члена, в котором он сохраняет корневой вид для каждого сообщения чата:

 public static class ChatHolder extends RecyclerView.ViewHolder { View mView; public ChatHolder(View itemView) { super(itemView); mView = itemView; } 

Мы можем использовать этот mView для доступа к интерактивному представлению. Вы должны добавить getter для mView , но я пытаюсь свести к минимуму изменения здесь.

Таким образом, в populateView мы можем использовать перегрузку с дополнительным параметром position и OnClickListener вещи с помощью 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 будет таким же: call adapter.getRef(position) чтобы получить ссылку на базу данных Для выбранного элемента.

Вот мое решение. Это сработало для меня

Класс 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);