2010-07-22 3 views
9

Мне известно setSelection(), setSelectionFromTop() и setSelectionAfterHeaderView(), но ни один из них, кажется, не делает то, что я хочу.Настройки ListView прокручивают позицию хорошо в Android

Учитывая, что элемент в списке, я хочу прокрутить так, чтобы он был в поле зрения. Если элемент находится над видимым окном списка, я хочу прокрутить, пока элемент не станет первым видимым элементом в списке; если элемент находится под видимым окном, я хочу, чтобы он прокручивался вверх до тех пор, пока он не станет последним видимым элементом в списке. Если элемент уже виден, я не хочу, чтобы прокрутка происходила.

Как это сделать?

+0

Почему не используются те методы, о которых вы говорили? Что происходит, когда вы устанавливаете выбор на нужном элементе? (Я знаю, что это старый вопрос. Если вы решили это к настоящему времени, отправьте свое решение, я был бы признателен) – HXCaine

+0

@ T3Roar: Я решил его с помощью комбинации setSelection() и setSelectionFromTop(), беспокоясь о высоте списка и высоте элемента, и, конечно, позиции позиции в списке. Боюсь, это беспорядок, и я не могу разделить код, но он разрешимый. Может быть, если я получу шанс, я напишу общее решение, которое я могу поделиться, но то, что у меня сейчас, просто не полезно вне контекста, в котором я его получил. Извините! –

+1

Ну, я рад, что использовать setSelection() было немного, чтобы достичь, а не какого-то другого сумасшедшего обходного пути. Спасибо за ответ :) – HXCaine

ответ

15

Это происходит потому, что listView еще не создан. Попробуйте размещать работоспособный такие как:

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
4

Я думаю, что я искал то же самое, то я нашел следующее решение:

if (listview.getFirstVisiblePosition() > pos 
    || listview.getLastVisiblePosition() <= pos) { 
    listview.smoothScrollToPosition(pos); 
} 

API 8 требуется использовать smoothScrollToPosition (который разумный минимум в любом случае), чтобы вы знали.

3

Ответ Сергея работает, но я считаю, что правильный способ сделать это - создать наблюдателя для уведомления, когда был создан ListView.

listView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    scrollTo(scrollToPosition); 
    listView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
} 
}); 
+1

это лучшее решение, но не забудьте удалить слушателя: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel

+0

Спасибо Rocel. Строка listView.getViewTreeObserver(). RemoveGlobalOnLayoutListener (this) делает это –

0

Лучшее решение для Sergey's answer является вызов setSelection() позже в жизненном цикле активности/фрагмента, возможно, в onStart(). Таким образом, у вас есть гарантия, что вид готов, а не использует какую-либо произвольную задержку.

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