【问题标题】:RecyclerView.Adapter getRef(position).getKey() not workingRecyclerView.Adapter getRef(position).getKey() 不工作
【发布时间】:2021-04-29 17:04:51
【问题描述】:

我正在使用带有 Android Studio 的 Firebase 实时数据库。在 FirebaseRecyclerAdapter 中,我可以使用 getRef(position).getKey(),但我使用的是 RecyclerView.Adapter,我想要获取密钥。我想获取他/她正在与之交谈的用户的 uid。

我的适配器类:



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

消息片段类:


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

            }
        });


    }

消息类:


  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:
       }

【问题讨论】:

  • “不工作”很难解决。在您标记的final String key = getRef(position).getKey() 行之后key 的值是多少?你期望它是什么?
  • @FrankvanPuffelen 它给出了一个错误。 “无法解析方法'getRef(int)'”。我想获取他/她正在发短信的用户的 uid
  • 哦,是的,我现在看到您没有使用 FirebaseUI。getRef() 方法特定于 FirebaseUI 中的适配器,除非您自己添加,否则其他适配器上不可用。跨度>

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

getRef() 方法特定于 FirebaseUI 中的适配器,而不是其他适配器上可用的东西,除非您在此处自己添加它。

为了能够获取项目的引用/密钥,您需要将密钥存储在适配器中,这正是 FirebaseUI 所做的。

所以在你的onChildAdded,你目前正在做:

Messages messages = dataSnapshot.getValue(Messages.class);

然后将该消息添加到适配器的列表中:

postList.add(messages);

您需要将其更改为还有一个键列表,它们的顺序相同。您可以使用已使用的dataSnapshot.getKey() 从每个快照中获取密钥。

因此,如果您只是创建一个键列表,并将其也传递给您的自定义适配器,那么更改可能会非常小。然后您可以使用该键列表来实现您自己的getRef(position)getKey(position)

【讨论】:

  • 我没有完全理解你的意思,因为我是新手。在我的 RecyclerView.Adapter 类中 getRef (position) .getKey ();我应该写什么
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
相关资源
最近更新 更多