![](/img/trans.png)
[英]Delete a node from Firebase realtime database with android studio java Recycler view
[英]Recycler View not updating messages from Firebase Database: Android Studio
當向 firebase 發送消息時,回收者視圖讀取它們但回收者視圖沒有立即更新....我已經嘗試過 notifyDataSetChanged() 但沒有工作...................... ..................................................... ................................................... ..................................... MessagingActivity.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());
}
}
}
從您的代碼中,當 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());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.