繁体   English   中英

RecyclerView.Adapter getRef(position).getKey() 不工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM