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);
これを行うには多くの方法がありますが、これは私がすぐに試した方法です。
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/2091 :
_ 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)
を呼び出します選択したアイテムの参照。
これが私の解決策です。これは私のために働いた
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);