消息系统,避免在listView中重复

问题描述 投票:1回答:1

我为我的android应用程序实现了一个消息系统。下面是它的工作原理 :

  • 用户发送消息
  • 消息将添加到数据库中,然后添加到listview适配器
  • 为了从其他用户那里获取消息,我实现了一个“轮询”服务器的后台线程。如果找到较旧的消息,则如果消息不在适配器中,则将其添加到listview适配器。

我面临的问题是,有时用户发送的消息会显示两次。我认为我理解了这个问题:轮询获取列表视图中尚未添加的新消息并将其添加到listview适配器。有没有办法避免这种行为?

以下是我检查轮询消息是否已在适配器中的方法:

public class MessageListViewAdapter : BaseAdapter
{
    List<Model.Message> messages = new List<Model.Message>();
    Context context;

    public MessageListViewAdapter(Context context,List<Model.Message> messages)
    {
        this.context = context;
        this.messages = messages;
    }
    public void add(Model.Message message)
    {

        if (!messages.Contains(message))
        {
            this.messages.Add(message);
            NotifyDataSetChanged(); // to render the list we need to notify
        }         
    }
    public override int Count =>messages.Count;

    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return position;
    }

如果您需要其他信息,请告诉我,也许我的解释不清楚或不够完整。提前致谢,

LIO

c# android xamarin polling
1个回答
0
投票

您应该做的是将列表视图与消息的存储分开。

您应该维护数组中的消息列表,而不是将项目放入列表视图中。键入消息时,可以将其与日期时间戳或GUID一起添加到阵列中。轮询时,如果数组不存在,还会向数组添加条目。创建一个名为AddItemToListView()或类似的方法来执行此操作

然后将列表视图的填充分开 - 创建一个名为UpdateListView()的方法,并在轮询后调用它并在键入消息并添加它之后调用它。

AddItemToListView()内部,你可以输入逻辑来检查项目是否已经在列表中,如果是,则不要添加它。通过比较日期时间或GUID。

我肯定会检查Date或GUID来比较消息,因为其他任何东西都不可靠,尤其是对象比较,这就是你正在做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.