RecyclerView.Adapter中的getRef(position).getKey()

在FirebaseRecyclerAdapter中,我可以使用getRef(position).getKey()但我使用的是RecyclerView.Adapter,我想在用户单击复选框时获取密钥。 这是我在onBindViewHolder()中的代码:

  @Override public void onBindViewHolder(@NonNull UsersViewHolders holder, final int position) { holder.setName(mUserNameList.get(position)); holder.setDesc(mUserDescList.get(position)); holder.setImage(mUserPicList.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //TODO: get the key } }); } 

是否可以在RecyclerView.Adapter中获取密钥?

我设法通过重构我的代码解决了我自己的问题。

1.在适配器类中,我为itemClickListener创建了一个接口

 public interface RecyclerViewItemClick { public void OnItemClickListener(UsersViewHolders holder, int position); } 

并创造一个全球性的

 private RecyclerViewItemClick mListener; 

将它添加到构造函数中

 public MessageListAdapter(RecyclerViewItemClick listener) { this.mListener = listener; } 

2.在onBindViewHolder()中,我通过了持有者和位置

 @Override public void onBindViewHolder(@NonNull final UsersViewHolders holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.OnItemClickListener(holder, position); } }); } 

3.在您的活动中,添加此代码。 为ArrayList声明一个全局变量来存储键并将addListenerForSingleValueEvent调用到DatabaseReference

 //mUserDatabase is a DatabaseReference mUserDatabase.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot datas : dataSnapshot.getChildren()) { String uid = datas.getKey(); //mUserKey is an ArrayList mUserKey.add(uid); } } } @Override public void onCancelled(DatabaseError databaseError) { } }); 

4.现在添加此项以获取每个职位的密钥

 mAdapter = new MyAdapter(new MyAdapter.RecyclerViewItemClick() { @Override public void OnItemClickListener(PickMemberAdapter.UsersViewHolders holder, int position) { String userKey = mUserKey.get(position); if (!holder.mCheckBox.isChecked()) { holder.mCheckBox.setChecked(true); Toast.makeText(MainActivity.this, userKey, Toast.LENGTH_LONG).show(); } else { holder.mCheckBox.setChecked(false); Toast.makeText(MainActivity.this, userKey, Toast.LENGTH_LONG).show(); } } });