当新消息到达时,将项目移动到列表视图的顶部

时间:2014-07-02 16:08:50

标签: android android-activity android-listview xmpp android-arrayadapter

我正在开发一个基于XMPP的android聊天...我很惊讶我需要将listview中项目的位置更新到顶部,以防new.message到达。

用例是..我在应用程序的联系人屏幕上,并且有一条新消息..所以这个联系人应该移动到列表顶部并变为粗体。这与whatsapp类似

如何做到这一点。我的课程是imolemebts活动,我已经实现了自定义列表适配器。

那么我怎样才能找到列表视图中是否存在某个项目,其次是如何动态更改位置

2 个答案:

答案 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();
    }