web-dev-qa-db-ja.com

SetOnItemClickListener FirebaseRecyclerViewAdapterを実装する方法

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);
9
Jonas Rotilli

これを行うには多くの方法がありますが、これは私がすぐに試した方法です。

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)を呼び出します選択したアイテムの参照。

15

これが私の解決策です。これは私のために働いた

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);
2
Abu Yousuf