簡體   English   中英

Recycler View 不更新來自 Firebase 數據庫的消息:Android Studio

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM