消息系统,避免在 listView 中重复
Messaging System, avoid duplicate in listView
我为我的 android 应用程序实现了一个消息系统。它是这样工作的:
- 用户发送消息
- 消息被添加到数据库中,然后添加到列表视图适配器中
- 为了从其他用户那里获取消息,我实现了一个 "poll" 服务器的后台线程。如果发现较旧的消息,如果该消息不在适配器中,则将其添加到列表视图适配器中。
我面临的问题是有时用户发送的消息会显示两次。我想我理解了这个问题:轮询获取列表视图中尚未添加的新添加消息并将其添加到列表视图适配器中。有没有办法避免这种行为?
以下是我检查轮询消息是否已在适配器中的方法:
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;
}
如果您需要其他信息,请告诉我,也许我的解释不够清楚或不够完整。
提前致谢,
里奥
您应该做的是将列表视图与消息的存储分开。
您不应将项目放入列表视图,而应在数组中维护消息列表。当您键入一条消息时,您可以将它与日期时间戳或 GUID 一起添加到数组中。轮询时,如果条目不存在,您还可以将条目添加到数组中。创建一个名为 AddItemToListView()
或类似的方法来执行此操作
然后将列表视图的填充分开 - 创建一个名为 UpdateListView()
的方法,并在轮询和键入消息并添加后调用它。
在 AddItemToListView()
中,您可以放置逻辑来检查该项目是否已经在列表中,如果是,则不要添加它。通过比较日期时间或 GUID。
我肯定会检查日期或 GUID 来比较消息,因为其他任何东西都不可靠,尤其是对象比较,这看起来就像你在做的那样。
我为我的 android 应用程序实现了一个消息系统。它是这样工作的:
- 用户发送消息
- 消息被添加到数据库中,然后添加到列表视图适配器中
- 为了从其他用户那里获取消息,我实现了一个 "poll" 服务器的后台线程。如果发现较旧的消息,如果该消息不在适配器中,则将其添加到列表视图适配器中。
我面临的问题是有时用户发送的消息会显示两次。我想我理解了这个问题:轮询获取列表视图中尚未添加的新添加消息并将其添加到列表视图适配器中。有没有办法避免这种行为?
以下是我检查轮询消息是否已在适配器中的方法:
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;
}
如果您需要其他信息,请告诉我,也许我的解释不够清楚或不够完整。 提前致谢,
里奥
您应该做的是将列表视图与消息的存储分开。
您不应将项目放入列表视图,而应在数组中维护消息列表。当您键入一条消息时,您可以将它与日期时间戳或 GUID 一起添加到数组中。轮询时,如果条目不存在,您还可以将条目添加到数组中。创建一个名为 AddItemToListView()
或类似的方法来执行此操作
然后将列表视图的填充分开 - 创建一个名为 UpdateListView()
的方法,并在轮询和键入消息并添加后调用它。
在 AddItemToListView()
中,您可以放置逻辑来检查该项目是否已经在列表中,如果是,则不要添加它。通过比较日期时间或 GUID。
我肯定会检查日期或 GUID 来比较消息,因为其他任何东西都不可靠,尤其是对象比较,这看起来就像你在做的那样。