首页 > 解决方案 > 不显示朋友的消息。onBindViewHolder 中的 ReceiverViewHolder 存在问题

问题描述

我在那里发送消息并从 Firebase 获取它们:

/ ChatActivity /
公共类 MainActivity 扩展 AppCompatActivity {

    FirebaseDatabase database = FirebaseDatabase.getInstance();
   DatabaseReference myRef = database.getReference("messages");
    EditText messageField;
    private FirebaseAuth mAuth;

    RecyclerView list_of_messages;

    TextView message_user;
    String senderUid;
    String receiverUid;
    ArrayList<Message> messages;

    String senderRoom, receiverRoom;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String name = getIntent().getStringExtra("name");
        String uid = getIntent().getStringExtra("uid");


        FloatingActionButton btn =
                (FloatingActionButton) findViewById(R.id.btnSend);
        messages = new ArrayList<>();
        messageField = findViewById(R.id.messageField);
        list_of_messages = findViewById(R.id.list_of_messages);

        
        DatabaseReference myRef = database.getReference("chats");

        DataAdapter dataAdapter = new DataAdapter(this, messages, senderRoom, receiverRoom);


        senderUid = FirebaseAuth.getInstance().getUid();
        receiverUid = getIntent().getStringExtra("uid");


        senderRoom = senderUid + receiverUid;
        receiverRoom = receiverUid + senderUid;

        LinearLayoutManager lin = (new LinearLayoutManager(this));
        lin.setStackFromEnd(true);
        list_of_messages.setLayoutManager(lin);

        list_of_messages.setAdapter(dataAdapter);
        TextView item_receive = findViewById(R.id.messageR);






        database.getReference().child("chats")
                .child(senderRoom)
                .child("messages")
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        messages.clear();
                        for(DataSnapshot snapshot1 : snapshot.getChildren()) {
                            Message message = snapshot1.getValue(Message.class);
                            messages.add(message);
                        }

                        dataAdapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String messageTxt = messageField.getText().toString();

                Date date = new Date();
                Message messages = new Message(messageTxt, senderUid, date.getTime());
                messageField.setText("");

                String randomKey = database.getReference().push().getKey();

                HashMap<String, Object> lastMsgObj = new HashMap<>();
                lastMsgObj.put("lastMsg", messages.getMsg());
                lastMsgObj.put("lastMsgTime", date.getTime());

                database.getReference().child("chats").child(senderRoom).updateChildren(lastMsgObj);
                database.getReference().child("chats").child(receiverRoom).updateChildren(lastMsgObj);

                database.getReference().child("chats")
                        .child(senderRoom)
                        .child("messages")
                        .child(randomKey)
                        .setValue(messages).addOnCompleteListener(new OnCompleteListener<Void>() {

                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        database.getReference().child("chats")
                                .child(receiverRoom)
                                .child("messages")
                                .child(randomKey)
                                .setValue(messages).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {

                            }
                        });
                    }
                });

            }
        });}}

当我尝试在 onBindViewHolder 中仅使用具有此类上下文的 ReceiverViewHolder 时出现错误:无法将 SendViewHolder 转换为 ReceiverViewHolder !!!!!!

/ MessageAdapter /公共类 DataAdapter 扩展 RecyclerView.Adapter {

    Context context;
    ArrayList<Message> messages;

    final int ITEM_SENT = 1;
    final int ITEM_RECEIVE = 2;

    String senderRoom;
    String receiverRoom;

    public DataAdapter(Context context, ArrayList<Message> messages, String senderRoom, String receiverRoom) {
        this.context = context;
        this.messages = messages;
        this.senderRoom = senderRoom;
        this.receiverRoom = receiverRoom;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == ITEM_SENT) {
            View view = LayoutInflater.from(context).inflate(R.layout.item_sent, parent, false);
            return new SentViewHolder(view);
        } else {
            View view = LayoutInflater.from(context).inflate(R.layout.item_receive, parent, false);
            return new ReceiverViewHolder(view);
        }
    }

    @Override
    public int getItemViewType(int position) {
        Message message = messages.get(position);
        if(FirebaseAuth.getInstance().getUid().equals(message.getSenderId())) {
            return ITEM_SENT;
        } else {
            return ITEM_RECEIVE;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        Message message = messages.get(position);







        if(holder.getClass() == SentViewHolder.class) {
            SentViewHolder viewHolder = (SentViewHolder)holder;



            viewHolder.message.setText(message.getMsg());


        } else {
            ReceiverViewHolder viewHolder = (ReceiverViewHolder)holder;

            viewHolder.messageR.setText(message.getMsg());


    }}

    @Override
    public int getItemCount() {
        return messages.size();
    }
    public class ReceiverViewHolder extends RecyclerView.ViewHolder {

        TextView messageR;

        public ReceiverViewHolder(@NonNull View itemView) {
            super(itemView);
            messageR = itemView.findViewById(R.id.messageR);
        }
    }

    public class SentViewHolder extends RecyclerView.ViewHolder {

       TextView message;
        public SentViewHolder(@NonNull View itemView) {
            super(itemView);
            message = itemView.findViewById(R.id.message);
        }
    }}

标签: databasefirebasechatdisplayandroid-viewholder

解决方案


推荐阅读