我正在开发一个基于XMPP的android聊天...我很惊讶我需要将listview中项目的位置更新到顶部,以防new.message到达。
用例是..我在应用程序的联系人屏幕上,并且有一条新消息..所以这个联系人应该移动到列表顶部并变为粗体。这与whatsapp类似
如何做到这一点。我的课程是imolemebts活动,我已经实现了自定义列表适配器。
那么我怎样才能找到列表视图中是否存在某个项目,其次是如何动态更改位置
答案 0 :(得分:2)
首先,请记住,ListView
只是Objects
列表的表示。因此,如果您想知道项目是否在ListView
中,您只需要检查相应的Object
是否在Objects
列表中。
当您想要更改一个项目的位置时,您必须更改列表中Object
的位置。
首先定义这些对象:
private ArrayList<MyObject> lists = new ArrayList<MyObject>();
private MyCustomAdapter myAdapter;
第一次创建ListView
时,只需执行以下操作:
//fill your list with your objects
lists.add(myObject1);
lists.add(myObject2);
lists.add(myObject3);
//create and set the adapter
myAdapter = new MyCustomAdapter(..., ..., lists);
myListView.setAdapter(myAdapter);
现在,您只需测试一下,lists
是否包含特定对象(与检查项目是否在ListView
中的对象相同):
lists.contains(anObject);
然后,如果要更改ListView
中特定项目的位置,则必须创建新列表并按正确顺序放置元素。您可以使用类似的东西(未经测试但应该可以使用):
private ArrayList<MyObject> moveItemToTop(ArrayList<MyObject> lists, int positionOfItem) {
if (lists == null || positionOfItem < 0 || positionOfItem >= lists.size()) {
return lists;
}
ArrayList<MyObject> sortedList = new ArrayList<MyObject>();
//add the item to the top
sortedList.add(lists.get(positionOfItem));
for (int i=0; i<lists.size(); i++) {
if (i != positionOfItem) {
sortedList.add(lists.get(i));
}
}
return sortedList;
}
甚至this(这更容易......)。
最后,请调用这两种方法来更新ListView
:
myAdapter = new MyCustomAdapter(..., ..., moveItemToTop(lists, itemPosition));
myListView.setAdapter(myAdapter);
答案 1 :(得分:0)
这是我解决的方法
private void moveMessageToTop(MessageObject message) {
int index = 0;
for (Friends friend : mFriends) {
if (friend.getName().equalsIgnoreCase(message.getFrom().split("@")[0])) {
index = mFriends.indexOf(friend);
break;
}
}
if (index != 0) {
mFriends.add(0,new Friends(message.getFrom().split("@")[0], message
.getMessage()));
} else {
Friends frnd = mFriends.get(index);
frnd.setStatus(message.getMessage());
mFriends.add(0, frnd);
mFriends.remove(index);
}
((ListAdapter) lvFriends.getAdapter()).notifyDataSetChanged();
}