1

在我的应用程序中,我显示了一个联系人列表以及他们的姓名、照片和在线状态。每次联系人更改其状态时,应用程序都会收到一个事件,而我要做的是使用联系人的新状态更新列表。

这就是我将列表绑定到自定义列表适配器的方式:

 ListView listView; 
 listView = FindViewById<ListView>(Resource.Id.List); 
 listView.Adapter = new ContactListAdapter(this, names); 

这是我的 ContactListAdapter 的 GetView 的一部分

 public override View GetView(int position, View convertView, ViewGroup parent) 
        { 
            var item = this.contacts.ElementAt(position); 
            var view = convertView; // re-use an existing view, if one is available 
           // if (view == null || !(convertView is LinearLayout)) // otherwise create a new one 
                view = context.LayoutInflater.Inflate(Resource.Layout.contactItemView, parent, false); 
            var p = context; 
            var imageItem = view.FindViewById(Resource.Id.presence) as ImageView; 

          string status = null; 
            foreach (CPresenceInfo pres in item.Presences) 
            { 
                if (pres.Type.ToString().Equals("TWS")) status = pres.StatusBusy; 
            } 
            if (status != null) 
            { 
                if (status.Equals("ONLINE")) imageItem.SetImageResource(Resource.Drawable.online); 
                if (status.Equals("BUSY")) imageItem.SetImageResource(Resource.Drawable.busy); 
                if (status.Equals("ABSENT")) imageItem.SetImageResource(Resource.Drawable.absent); 
                if (status.Equals("OFFLINE")) imageItem.SetImageResource(Resource.Drawable.offline); 

            } 
            return status; 

            return view; 
        } 



// And the method that receives the event: 
        void CEventParser_OnPresenceChangedEvent(string personGuid, CPresenceInfo presence) 
        { 
                //Update the contact row or the entire list?? 
        } 

我不知道我是否可以只更新列表中的一行,或者我是否必须更新整个列表。但在这两种情况下我都不知道该怎么做......我知道有一种NotifyDataSetChanged()方法,但我不知道如何以及在哪里使用它。

4

1 回答 1

0

更新所有项目

您可以在新数据可用后仅使用 NotifyDataSetChanged 方法来执行此操作 - 这将触发列表视图完全重绘自身。它将向您的适配器发出新请求以执行此操作。

更新一项内的内容

一种方法是记录哪些视图当前用于哪些记录。

显然,您必须小心记住,随着列表滚动,视图会被重用。

如果您跟踪当前视图项映射,那么每次更新当前视图相对简单。

于 2013-02-19T22:24:25.147 回答