简体   繁体   English

Recycler View 不更新来自 Firebase 数据库的消息:Android Studio

[英]Recycler View not updating messages from Firebase Database: Android Studio

When sending messages to firebase recycler view reading them but recycler view not updating instantly....i have tried notifyDataSetChanged() but not working................................................................................................................................................................. MessagingActivity.java当向 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 strong text 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());

    }
}

} }

From your code, your messages should be visible when firebase notify you with changes in your db.从您的代码中,当 firebase 通知您数据库发生更改时,您的消息应该是可见的。

Please, try next code:请尝试下一个代码:

MessagingActivity消息活动

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);
        }
    });


}

And the Adapter:和适配器:

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.

相关问题 使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点 - Delete a node from Firebase realtime database with android studio java Recycler view Android Studio - Recycler View 不在消息传递应用程序上显示已发送的消息 - Android Studio - Recycler View not showing sent messages on a messaging application 我想使用 GeoFire 在 android 中填充 Firebase Recycler View - i want to use GeoFire to Populate Firebase Recycler View in android android firebase 实时数据库问题(回收站视图,onclick 按钮,删除) - android firebase realtimedatabase Questions(recycler view, onclick button, remove) 如何从 Firebase 获取嵌套数据到回收站视图 - How to fetch nested data from Firebase to recycler view 为什么 firebase 无法在回收站视图中查询集合中的数据? - Why firebase is not able to query data from collection in recycler view? Recycler 视图未使用数组列表显示来自 firebase 的数据 - Recycler view is not displaying data from firebase using an array list Firebase Android Studio 数据库查询 - Firebase Database Query in Android Studio 我的应用程序返回到上一页而没有将数据更新到数据库。 (使用 Android studio + Firebase) - My app is gets back to previous page without updating data to database. (Using Android studio + Firebase) 无法从 Android Studio 中的 Firebase 数据库读取数据 - Not able to read data from Firebase Database in Android Studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM