Добавить новые элементы в верхней части списка на Android? - PullRequest
31 голосов
/ 06 мая 2011

В Android предусмотрен режим расшифровки , позволяющий автоматически прокручивать представление списка вниз при добавлении новых данных в адаптер.

Можно ли это как-то отменить, чтобы новые элементыавтоматически добавляется вверху списка («режим обратной транскрипции»)

Метод stackFromBottom кажется правильным, но не выполняет автоматическую прокрутку при изменении ввода.

У кого-нибудь есть пример кода, где список постоянно добавляет материал, который всегда вставляется вверху?Я на правильном пути?

Обновление

Спасибо за ответы, которые заставили меня задуматься.На самом деле.Я хочу, чтобы новые записи появлялись вверху, но на экране все еще отображается элемент, на который смотрит пользователь.Пользователь должен активно прокручивать вверх, чтобы просмотреть новые предметы.Так что я думаю, что режим расшифровки не то, что я хочу.

Ответы [ 7 ]

45 голосов
/ 06 мая 2011

Хм, ну, если бы я собирался попробовать это, я бы сделал что-то вроде следующего:

List items = new ArrayList();

//some fictitious objectList where we're populating data
for(Object obj : objectList) {
    items.add(0, obj);
    listAdapter.notifyDataSetChanged();
}

listView.post(new Runnable() {
    @Override
    public void run() {
        listView.smoothScrollToPosition(0);
    }
}

Я не знаю наверняка, что это будет работать, но это кажется логичным.По сути, просто добавьте элемент в начале списка (позиция 0), обновите адаптер списка и прокрутите до позиции (0, 0).

9 голосов
/ 21 февраля 2015

вместо этого:

items.add(edittext.getText().toString());
adapter.notifyDataSetChanged();

ты должен попробовать это (работает для меня):

listview.post(new Runnable() {
            @Override
            public void run() {
                items.add(0, edittext.getText().toString());
                adapter.notifyDataSetChanged();
                listview.smoothScrollToPosition(0);
            }
            });
7 голосов
/ 06 октября 2011

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

Проблема в том, что вы хотите динамически добавить еще 50 или 100 записи наверх, но прокрутка должна быть непрерывной, откуда добавленные элементы были добавлены.

В тот момент, когда вы делаете notifyDataSetChanged, ListView автоматически позиционирует себя на первом элементе в вашем наборе данных, а НЕ на позиции, которая предшествовала позиции, в которую были вставлены новые элементы.

Похоже, ваш список только что перепрыгнул 50 или 100 записей. Я считаю, что TranscriptMode, установленный на normal, не является решением . Представление списка должно функционировать как обычное представление списка, и вам необходимо программно прокрутить до конца списка, чтобы имитировать TranscriptMode, поскольку он функционирует в «нормальном» режиме.

7 голосов
/ 06 мая 2011

Разве не достаточно просто добавить smoothScrollToPosition(0) всякий раз, когда материал добавляется в ListView?Не думайте, что есть опция автоматической прокрутки.

2 голосов
/ 19 ноября 2016

Это решает проблему:

...
ListView lv;
ArrayAdapter<String> adapter;
ArrayList<String> aList;
...
        lv = (ListView) findViewById(R.id.mylist);

        aList = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, aList);
        lv.setAdapter(aAdapter);
        ...
        adapter.insert ("Some Text 1", 0);
        adapter.insert ("Some Text 2", 0);
        adapter.insert ("Some Text 3", 0);
        ...
2 голосов
/ 11 сентября 2013

Попробуйте использовать

LinkedList items = new LinkedList<Object>();

//some fictitious objectList where we're populating data
for(Object obj : objectList) {
    items.addFirst(obj);
}
listAdapter.notifyDataSetChanged();
0 голосов
/ 22 апреля 2017

Вы должны попробовать это (указать позицию и обновить адаптер)

list.add(0,editTextSName.getText().toString());
adapter.notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...