【问题标题】:Listview in firebase shows the same message twice in listviewFirebase中的Listview在listview中两次显示相同的消息
【发布时间】:2018-08-03 13:14:18
【问题描述】:

我有一个应用程序,它涉及消息传递,它发送和显示非常好,但是它在 listView 中两次显示相同的消息,我真的不明白,我见过其他类似的问题,但是它们都是量身定制的对于那个特定的问题,这是我的代码:

聊天活动(每当发送消息时都会调用它):

private void append_chat_conversation(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            Log.e("Chat details: ", String.valueOf(ds));
            chat_username = dataSnapshot.child("username").getValue(String.class);
            chat_msg = dataSnapshot.child("message").getValue(String.class);

            Chat chat = new Chat(chat_username, chat_msg);
            chatList.add(chat);
            Log.e("Chat username: ", "" + chat_username);
            Log.e("Chat message: ", "" + chat_msg);
        }
        adapter.notifyDataSetChanged();
    }

我的聊天列表适配器:

public class chatListAdapter extends ArrayAdapter<Chat> {

    private Context mContext;
    int mResource;
    TextView usernameTV, messageTV;

    public chatListAdapter(Context context, int resource, ArrayList<Chat> objects) {
        super(context, resource, objects);
        mContext = context;
        mResource = resource;

    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String username = getItem(position).getUsername();
        String message = getItem(position).getMessage();

        Chat chat = new Chat(username, message);

        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(mResource, parent, false);


        usernameTV = convertView.findViewById(R.id.username_chat);
        messageTV = convertView.findViewById(R.id.message_chat);

        usernameTV.setText(username);
        messageTV.setText(message);

        return convertView;
    }
}

聊天模型:

public class Chat {
    private String username, message;

    public Chat(String username, String message) {
        this.username = username;
        this.message = message;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

提前感谢您的帮助!

插件

我的事件监听器:

chatURLRoot.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                chatList.clear();
                append_chat_conversation(dataSnapshot);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                //append_chat_conversation(dataSnapshot);
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

然后,每当发送消息时,它都会调用此方法:

public String chat_msg, chat_username;

    private void append_chat_conversation(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            Log.e("Chat details: ", String.valueOf(ds));
            chat_username = dataSnapshot.child("username").getValue(String.class);
            chat_msg = dataSnapshot.child("message").getValue(String.class);

            Chat chat = new Chat(chat_username, chat_msg);
            chatList.add(chat);
            Log.e("Chat username: ", "" + chat_username);
            Log.e("Chat message: ", "" + chat_msg);
        }
        adapter.notifyDataSetChanged();
    }

【问题讨论】:

  • 在添加值之前清除您的数组列表。
  • 您能进一步解释一下吗?抱歉,我习惯了快速,所以我对此有点陌生:)
  • @NathanEllis,请在 for (DataSnapshot ds : dataSnapshot.getChildren()) 行上方添加chatList.clear(); 并检查。
  • @NathanEllis,您使用哪个ValueEventListener 来获取addValueEventListeneraddListenerForSingleValueEvent 之类的值?
  • @NiravBhavsar 它是一个 addChildEventListener,因为它总是必须不断地监听更多的新消息?

标签: java android listview firebase-realtime-database adapter


【解决方案1】:

在添加新的DataSnapshot 之前,您必须清除您的列表,如下所示

private void append_chat_conversation(DataSnapshot dataSnapshot) {
        chatList.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            Log.e("Chat details: ", String.valueOf(ds));
            chat_username = dataSnapshot.child("username").getValue(String.class);
            chat_msg = dataSnapshot.child("message").getValue(String.class);

            Chat chat = new Chat(chat_username, chat_msg);
            chatList.add(chat);
            Log.e("Chat username: ", "" + chat_username);
            Log.e("Chat message: ", "" + chat_msg);
        }
        adapter.notifyDataSetChanged();
    }

【讨论】:

  • 我试过了,但它仍然添加了两次,但它也删除了以前的消息
  • 那么您需要从列表中删除该位置,然后添加新的数据快照
  • 对不起,正如我所说,我是 android 新手,您能进一步解释一下吗?非常感谢
猜你喜欢
  • 2012-01-02
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2021-12-23
相关资源
最近更新 更多