Переместить элемент в начало списка при поступлении нового сообщения

Я работаю над чатом на основе XMPP в Android... и меня поражает момент, когда мне нужно обновить позицию элемента в списке вверху на случай, если появится новое сообщение.

Вариант использования: я нахожусь на экране «Контакты» в приложении, и приходит новое сообщение.. поэтому этот контакт должен переместиться в начало списка и стать жирным. Это то, что похоже на WhatsApp, а также

Как это может быть сделано. Моя активность класса imolemebts, и я реализовал пользовательский адаптер списка.

Итак, как я могу узнать, существует ли элемент в списке, и, во-вторых, как динамически изменить положение


person Akash Khanna    schedule 02.07.2014    source источник


Ответы (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;
}

Или даже это (что намного проще...).

Наконец, вызовите эти два метода, чтобы обновить ListView:

myAdapter = new MyCustomAdapter(..., ..., moveItemToTop(lists, itemPosition));
myListView.setAdapter(myAdapter);
person G.T.    schedule 02.07.2014
comment
Благодарю за ваш ответ. Попробуем это. - person Akash Khanna; 03.07.2014

Вот как я это решил

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();
    }
person Akash Khanna    schedule 10.07.2014