Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 消息系统,避免在listView中重复_C#_Android_Xamarin_Polling - Fatal编程技术网

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

C# 消息系统,避免在listView中重复,c#,android,xamarin,polling,C#,Android,Xamarin,Polling,我为我的android应用程序实现了一个消息传递系统。以下是它的工作原理: 用户发送一条消息 将消息添加到数据库中,然后添加到listview适配器中 为了从其他用户那里获取消息,我实现了一个后台线程来“轮询”服务器。如果找到较旧的消息,如果该消息不在适配器中,则将其添加到listview适配器中 我面临的问题是,有时用户发送的消息会显示两次。我想我理解了这个问题:轮询将新添加的消息作为不在listview中的消息获取,并将其添加到listview适配器。有没有办法避免这种行为 下面是我检查

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

  • 用户发送一条消息
  • 将消息添加到数据库中,然后添加到listview适配器中
  • 为了从其他用户那里获取消息,我实现了一个后台线程来“轮询”服务器。如果找到较旧的消息,如果该消息不在适配器中,则将其添加到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;
    }
公共类MessageListViewAdapter:BaseAdapter { 列表消息=新列表(); 语境; public MessageListViewAdapter(上下文、列表消息) { this.context=上下文; this.messages=消息; } 公共无效添加(Model.Message) { 如果(!messages.Contains(message)) { this.messages.Add(message); NotifyDataSetChanged();//要呈现我们需要通知的列表 } } public override int Count=>messages.Count; public override Java.Lang.Object GetItem(int位置) { 返回null; } 公共覆盖长GetItemId(int位置) { 返回位置; } 如果您需要其他信息,请告诉我,可能我的解释不清楚或不够完整。 提前感谢,


Lio

您应该做的是将listview与消息的存储区分开

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

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

AddItemToListView()中,您可以使用逻辑检查该项是否已在列表中,如果已在列表中,则不要添加该项。通过比较日期时间或GUID


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

您应该做的是将listview与消息的存储区分开

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

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

AddItemToListView()中,您可以使用逻辑检查该项是否已在列表中,如果已在列表中,则不要添加该项。通过比较日期时间或GUID


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

谢谢,我会试试看!谢谢,我会试试看!