2015-03-31 5 views
0

Это для планшета с Android 4.4.2. У меня есть ListView с сотнями элементов в нем, и около 20 видимых одновременно. Пользователь не хочет анимации гладкой прокрутки. Как программно установить отображаемую позицию в Listview без использования smoothScrollToPosition()?Программно заданное положение в ListView без прокрутки

Я искал Переполнение стека и Android ListView setSelection() does not seem to work они предложили это:

mListView.clearFocus(); 
mListView.post(new Runnable() { 
    @Override 
    public void run() { 
     mListView.setSelection(index); 
    } 
}); 

. , , но он просто устанавливает выбор; он не отображает эту часть ListView. setSelection() кажется популярным решением по всему Интернету, но я не мог найти ничего в документации, говорящей, что setSelection() также устанавливает положение, и он ТОЛЬКО устанавливает выбор и не меняет позицию на моем ,

В Go to a item in Listview without using smoothScrollToPosition они предложили решение по Romain Guy ...

[myListView.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     myListView.setSelection(pos); 
     View v = myListView.getChildAt(pos); 
     if (v != null) 
     { 
      v.requestFocus(); 
     } 
    } 
});] 

Проблема с этого является то, что мой ListView является частью ListActivity управляется с помощью пользовательского адаптера GetView(), так Представления, которые не видны, перерабатываются, т. Е. Если я запрашиваю дочерний вид представления, которого нет на экране, он возвращает null. Во всяком случае, это действительно ListView, который я пытаюсь контролировать, поэтому сделать это косвенно через дочерний вид кажется ужасно косвенным.

Как сообщить ListView, какую часть его я хочу видеть на экране?

+0

Вы проверили [этот] (http://stackoverflow.com/questions/12706520/problems-with-listview-inside-a-popupwindow)? – m0skit0

+0

@ m0skit0 Не похоже, что он пытался установить позицию; похоже, он пытался установить выбор. На мой вопрос я не вижу решения. Преобразованные элементы, прошедшие в getView, будут доступны только для видимых видов, поэтому, похоже, попытка решить это в getView ставит телегу перед лошадью. – user316117

ответ

5

В AbsListView есть метод, называемый smoothScrollToPositionFromTop(), и он принимает параметр duration. Поэтому, если вы установите его на 0, вы можете сделать это без прокрутки, анимации.

smoothScrollToPositionFromTop.

+1

Отлично. Работала отлично. И ListView получен из AbsListView, поэтому я получаю его бесплатно. Благодаря! – user316117

+0

Не работает для меня. В частности, установка длительности 0 по-прежнему приводит к анимированной прокрутке. Даже при установке небольшого ненулевого значения произойдет анимированный переход с длительностью, которая значительно превышает указанное мной значение. Похоже, что, возможно, API налагает минимальную продолжительность/максимальную скорость прокрутки или что-то в этом роде. Протестировано на уровне Google Pixel, API уровня 25. – aroth

+0

@aroth Я действительно не использовал его в последнее время. Но Раньше это работало во время моего ответа. – osayilgan

Смежные вопросы