Добавить новые элементы в начало списка на Android?
Android имеет режим расшифровки, чтобы позволить автоматически прокручивать представление списка снизу, когда новые данные добавляются к адаптеру.
Может ли это быть каким-то образом отменено, так что новые элементы автоматически добавляются в верхней части списка ( "режим обратной транскрипции" )
Метод stackFromBottom кажется правильным, но не выполняет автоматическую прокрутку при изменении ввода.
Есть ли у кого-нибудь пример кода, в котором список постоянно добавляет материал, который всегда вставлен вверху? Я на правильном пути здесь?
Обновление
Спасибо за ответы, что заставило меня думать больше. На самом деле. Я хочу, чтобы новые записи отображались вверху, но на экране по-прежнему отображается элемент, на который смотрит пользователь. Пользователь должен активно прокручивать вверх, чтобы просмотреть новые элементы. Поэтому я предполагаю, что режим транскрипции - это не то, что я хочу.
Ответы
Ответ 1
Хм, хорошо, если я собираюсь попробовать это, я бы сделал что-то вроде следующего:
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).
Ответ 2
вместо этого:
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);
}
});
Ответ 3
Не должно ли быть достаточно просто добавить smoothScrollToPosition(0)
, когда материал будет добавлен в ListView? Не думайте, что есть опция автоматического прокрутки.
Ответ 4
Я провел несколько часов, пытаясь выполнить одно и то же. По сути, это действует как чат-приложение, в котором пользователь просматривает старые сообщения в верхней части списка.
Проблема заключается в том, что вы хотите динамически добавлять еще 50 или 100 записи вверх, но прокрутка должна быть непрерывной, откуда добавлены добавленные элементы.
В тот момент, когда вы выполняете notifyDataSetChanged
, ListView автоматически позиционирует себя в первом элементе в вашем наборе данных и НЕ в позиции, которая предшествовала позиции, в которую были вставлены новые элементы.
Это делает его похожим на то, что ваш список просто перескочил на 50 или 100 записей. Я считаю, что TranscriptMode, установленный в нормальное состояние, не является решением. Список должен функционировать как обычный список, и вам нужно программно прокручивать нижнюю часть списка, чтобы имитировать TranscriptMode, поскольку он функционирует под "нормальным".
Ответ 5
Попробуйте использовать
LinkedList items = new LinkedList<Object>();
//some fictitious objectList where we're populating data
for(Object obj : objectList) {
items.addFirst(obj);
}
listAdapter.notifyDataSetChanged();
Ответ 6
Это устраняет проблему:
...
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);
...
Ответ 7
вы должны попробовать это (положение списка и адаптер обновления)
list.add(0,editTextSName.getText().toString());
adapter.notifyDataSetChanged();