【问题标题】:Recycler View not updating messages from Firebase Database: Android StudioRecycler View 不更新来自 Firebase 数据库的消息:Android Studio
【发布时间】:2021-01-24 05:59:34
【问题描述】:

当发送消息到 firebase 回收视图读取它们但回收视图没有立即更新....我尝试过 notifyDataSetChanged() 但没有工作...................... ..................................................... ..................................................... ……………………………………………………………………………………………………………………………………………… 消息活动.java

public class MessagingActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    ImageView ivBack, ivSend;
    EditText etTypeMessage;
    TextView tvName;
    String Receiverphone, image, name;
    CircleImageView civProfile;
    DatabaseReference reference;
    MessagingAdapter adapter;
    ArrayList<MessagingBinding> list;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_messaging);

    recyclerView = findViewById(R.id.rv_messagingActivity);
    ivBack = findViewById(R.id.ivBack_messagingActivity);
    etTypeMessage = findViewById(R.id.etTypeMessage_activityMessaging);
    tvName = findViewById(R.id.tvName_activityMessaging);
    civProfile = findViewById(R.id.civProfile_messagingActivity);
    ivSend = findViewById(R.id.ivSend_activityMessaging);

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    image = getIntent().getStringExtra("image");
    name = getIntent().getStringExtra("name");
    Receiverphone = getIntent().getStringExtra("phone");

    tvName.setText(name);
    Picasso.get().load(image).into(civProfile);

    reference = FirebaseDatabase.getInstance().getReference().child("Users");

    ivSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Messages messages = new Messages(etTypeMessage.getText().toString(), name, image, Singleton.obj.phone, Receiverphone);
            reference.child("messages").push().setValue(messages);
            etTypeMessage.setText("");
            adapter.notifyDataSetChanged();

        }
    });

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MessagingActivity.this);
    linearLayoutManager.setStackFromEnd(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(linearLayoutManager);


    list = new ArrayList<>();
    

    reference.child("messages").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                Messages messages = dataSnapshot.getValue(Messages.class);
                if (messages.getSenderphone().equals(Singleton.obj.phone) && messages.getReceiverPhone().equals(Receiverphone)) {
                    list.add(messages);
                }

            }
            adapter = new MessagingAdapter(list);
            recyclerView.setAdapter(adapter);
            adapter.notifyDataSetChanged();

        }

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

        }

    });


    ivBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MessagingActivity.this, MainActivity.class);
            startActivity(intent);
        }
    });


}

}

MessagingAdapter.java强文本

public class MessagingAdapter extends RecyclerView.Adapter {

private ArrayList<MessagingBinding> bindingList;

public MessagingAdapter(ArrayList<MessagingBinding> bindingList) {
    this.bindingList = bindingList;
}


@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view;
    switch (viewType) {
        case (MessagingBinding.TYPE_SENDER):
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_sendermessaging, parent, false);
            return new SenderViewHolder(view);
        default:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_receivermessaging, parent, false);
            return new ReceiverViewHodler(view);

    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    switch (getItemViewType(position)) {
        case (MessagingBinding.TYPE_SENDER):
            ((SenderViewHolder) holder).bindView(position);

            break;
        case (MessagingBinding.TYPE_RECEIVER):
            ((ReceiverViewHodler)holder).bindView(position);
            break;

    }

}

@Override
public int getItemCount() {
    if (bindingList == null) {
        return 0;
    } else {
        return bindingList.size();
    }
}

@Override
public int getItemViewType(int position) {
    return bindingList.get(position).getType();
}

class SenderViewHolder extends RecyclerView.ViewHolder {
    TextView tvSender;
    ImageView ivSender;

    public SenderViewHolder(@NonNull View itemView) {
        super(itemView);
        tvSender = itemView.findViewById(R.id.tvSender_listItemsMessaging);
        ivSender = itemView.findViewById(R.id.ivSender_listItemMessaging);
    }

    void bindView(int position) {
        SenderMessaging sender = (SenderMessaging) bindingList.get(position);
        tvSender.setText(sender.getTvSenderMsg());
        ivSender.setImageResource(sender.getImg());
    }
}

//-------------------------------ReceiverViewHolder----------------------------------
class ReceiverViewHodler extends RecyclerView.ViewHolder {
    TextView tvReceiver;

    public ReceiverViewHodler(@NonNull View itemView) {
        super(itemView);
        tvReceiver = itemView.findViewById(R.id.tvReceiver_listItemsMessaging);
    }

    void bindView(int position) {
        Messages receiver = (Messages) bindingList.get(position);
        tvReceiver.setText(receiver.getMessage());

    }
}

}

【问题讨论】:

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


    【解决方案1】:

    从您的代码中,当 Firebase 通知您数据库中的更改时,您的消息应该是可见的。

    请尝试下一个代码:

    消息活动

    public class MessagingActivity extends AppCompatActivity {
        RecyclerView recyclerView;
        ImageView ivBack, ivSend;
        EditText etTypeMessage;
        TextView tvName;
        String Receiverphone, image, name;
        CircleImageView civProfile;
        DatabaseReference reference;
        MessagingAdapter adapter;
        ArrayList<MessagingBinding> list;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messaging);
    
        recyclerView = findViewById(R.id.rv_messagingActivity);
        ivBack = findViewById(R.id.ivBack_messagingActivity);
        etTypeMessage = findViewById(R.id.etTypeMessage_activityMessaging);
        tvName = findViewById(R.id.tvName_activityMessaging);
        civProfile = findViewById(R.id.civProfile_messagingActivity);
        ivSend = findViewById(R.id.ivSend_activityMessaging);
    
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    
        image = getIntent().getStringExtra("image");
        name = getIntent().getStringExtra("name");
        Receiverphone = getIntent().getStringExtra("phone");
    
        tvName.setText(name);
        Picasso.get().load(image).into(civProfile);
    
        reference = FirebaseDatabase.getInstance().getReference().child("Users");
    
        ivSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Messages messages = new Messages(etTypeMessage.getText().toString(), name, image, Singleton.obj.phone, Receiverphone);
                reference.child("messages").push().setValue(messages);
                etTypeMessage.setText("");
    
            }
        });
    
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MessagingActivity.this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(linearLayoutManager);
    
    
        list = new ArrayList<>();
        
    
        reference.child("messages").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
    
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    Messages messages = dataSnapshot.getValue(Messages.class);
                    if (messages.getSenderphone().equals(Singleton.obj.phone) && messages.getReceiverPhone().equals(Receiverphone)) {
                        list.add(messages);
                    }
    
                }
                adapter = new MessagingAdapter(list);
                recyclerView.setAdapter(adapter);
                adapter.updateList(list);
    
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
    
            }
    
        });
    
    
        ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MessagingActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    
    
    }
    

    还有适配器:

    public class MessagingAdapter extends RecyclerView.Adapter {
    
    private ArrayList<MessagingBinding> bindingList;
    
    public MessagingAdapter(ArrayList<MessagingBinding> bindingList) {
        this.bindingList = bindingList;
    }
    
    
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        switch (viewType) {
            case (MessagingBinding.TYPE_SENDER):
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_sendermessaging, parent, false);
                return new SenderViewHolder(view);
            default:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_receivermessaging, parent, false);
                return new ReceiverViewHodler(view);
    
        }
    }
    
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case (MessagingBinding.TYPE_SENDER):
                ((SenderViewHolder) holder).bindView(position);
    
                break;
            case (MessagingBinding.TYPE_RECEIVER):
                ((ReceiverViewHodler)holder).bindView(position);
                break;
    
        }
    
    }
    
    @Override
    public int getItemCount() {
        if (bindingList == null) {
            return 0;
        } else {
            return bindingList.size();
        }
    }
    
    public void updateList(ArrayList<MessagingBinding> messages){
        this.bindingList = messages;
        this.notifyDataSetChanged();
    }
    
    @Override
    public int getItemViewType(int position) {
        return bindingList.get(position).getType();
    }
    
    class SenderViewHolder extends RecyclerView.ViewHolder {
        TextView tvSender;
        ImageView ivSender;
    
        public SenderViewHolder(@NonNull View itemView) {
            super(itemView);
            tvSender = itemView.findViewById(R.id.tvSender_listItemsMessaging);
            ivSender = itemView.findViewById(R.id.ivSender_listItemMessaging);
        }
    
        void bindView(int position) {
            SenderMessaging sender = (SenderMessaging) bindingList.get(position);
            tvSender.setText(sender.getTvSenderMsg());
            ivSender.setImageResource(sender.getImg());
        }
    }
    
    //-------------------------------ReceiverViewHolder----------------------------------
    class ReceiverViewHodler extends RecyclerView.ViewHolder {
        TextView tvReceiver;
    
        public ReceiverViewHodler(@NonNull View itemView) {
            super(itemView);
            tvReceiver = itemView.findViewById(R.id.tvReceiver_listItemsMessaging);
        }
    
        void bindView(int position) {
            Messages receiver = (Messages) bindingList.get(position);
            tvReceiver.setText(receiver.getMessage());
    
            }
        }
    
    }
    

    【讨论】:

    • 你调用adapter.updateList(list);在消息活动中?还有,是不是不行?或者它会缓慢更新您的 recyclerView 但最终可以工作?
    • 谢谢!它已通过使用 reference.addValueEventListener 解决
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多