![](/img/trans.png)
[英]getRef(position).getKey() in RecyclerView.Adapter
[英]RecyclerView.Adapter getRef(position).getKey() not working
我正在使用 Firebase 实时数据库和 Android Studio。在 FirebaseRecyclerAdapter 中,我可以使用 getRef(position).getKey() 但我使用的是 RecyclerView.Adapter,我想获得密钥。 我想获取他/她正在与之交谈的用户的 uid。
我的适配器 class:
public class MessageFragmentAdapter extends
RecyclerView.Adapter<MessageFragmentAdapter.MessageFragmentViewHolder> {
private List<Messages> postList;
private FirebaseAuth mAuth;
String currentUserid ;
DatabaseReference ChatsRef , UsersRef
public MessageFragmentAdapter(List<Messages> postList) {
this.postList = postList ;
}
@NonNull
@Override
public MessageFragmentViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view =LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.message_list_model,viewGroup,false);
mAuth = FirebaseAuth.getInstance();
currentUserid = mAuth.getCurrentUser().getUid();
ChatsRef = FirebaseDatabase.getInstance().getReference().child("message").child(currentUserid);
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
return new MessageFragmentViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MessageFragmentAdapter.MessageFragmentViewHolder messageFragmentViewHolder, int i) {
final Messages messages = postList.get(i);
**final String key = getRef(position).getKey();**
try {
UsersRef.child(**key**).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("name")){
final String retName = dataSnapshot.child("name").getValue().toString();
messageFragmentViewHolder.userName.setText(retName);
}
消息片段 class:
private final List<Messages> postList =new ArrayList<>();
LinearLayoutManager linearLayoutManager ;
MessageFragmentAdapter messageFragmentAdapter ;
RecyclerView chatlist;
DatabaseReference ChatsRef ;
FirebaseAuth mAuth ;
String currentUserID ;
mAuth = FirebaseAuth.getInstance();
currentUserID = mAuth.getCurrentUser().getUid();
ChatsRef = FirebaseDatabase.getInstance().getReference().child("message").child(currentUserID);
chatlist = messagefragment.findViewById(R.id.chats_list);
messageFragmentAdapter = new MessageFragmentAdapter(postList);
chatlist.setHasFixedSize(true);
linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
chatlist.setLayoutManager(linearLayoutManager);
chatlist.setAdapter(messageFragmentAdapter);
public void getmesssages(){
ChatsRef.orderByChild("timestamp").limitToLast(currentpage *
total_ITEMS).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
try {
Messages messages = dataSnapshot.getValue(Messages.class);
itemPos++;
if(itemPos == 1){
String messageKey = dataSnapshot.getKey();
mLastKey = messageKey;
mPrevKey = messageKey;
}
postList.add(messages);
messageFragmentAdapter.notifyDataSetChanged();
chatlist.smoothScrollToPosition(chatlist.getAdapter().getItemCount());
chatlist.scrollToPosition(postList.size() - 1);
chatlist.setVisibility(View.VISIBLE);
}catch (Exception e){
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
消息 class:
public class Messages {
public String data , time ,type , message , from ;
public Messages(){
}
public Messages(String data, String time, String type, String message, String from) {
this.data = data;
this.time = time;
this.type = type;
this.message = message;
this.from = from;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
我有这个数据库:
message: {
CurrentUser uıd: {
Uid of the person he/she is talking to:(I want this key) {
random key: {
-date
-from
-message
-time
-type
}
random key: {
}
}
timestamp:
}
getRef()
方法特定于 FirebaseUI 中的适配器,而不是其他适配器上可用的东西,除非您在此处自己添加它。
为了能够获取项目的引用/密钥,您需要将密钥存储在适配器中,这也正是 FirebaseUI 所做的。
所以在你的onChildAdded
中,你目前正在做:
Messages messages = dataSnapshot.getValue(Messages.class);
然后将该消息添加到适配器的列表中:
postList.add(messages);
您需要将其更改为还有一个键列表,它们的顺序相同。 您可以使用已使用的dataSnapshot.getKey()
从每个快照中获取密钥。
因此,如果您只是创建一个键列表,并将其传递给您的自定义适配器,则更改可能相当小。 然后您可以使用该键列表来实现您自己的getRef(position)
或getKey(position)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.