Android ListView scrollTo - PullRequest
       33

Android ListView scrollTo

3 голосов
/ 24 ноября 2010

У меня есть LinearLayout, который содержит некоторые другие представления и среди них ListView.Это представление загружается из другого, нажав кнопку.

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

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

Я пробовал с setSelected() и scrollTo(x,y) и scrollBy(x,y), но безудачи.

Я также попробовал этот кусок кода, как бы он ни был уродлив, но я просто хотел попробовать, чтобы он работал:

ListView categoryList = (ListView)findViewById(R.id.category_list);
        categoryList.post(new Runnable() {
            @Override
            public void run() {
                Log.d(this.getClass().getName(), "CategoryActivity.scrollToIndex: " + CategoryActivity.scrollToIndex);
                if(CategoryActivity.scrollToIndex>0){
                    ListView categoryList = (ListView)findViewById(R.id.category_list);
                    categoryList.setScrollContainer(true);
                    categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
                    categoryList.requestLayout();

                }
            }
        });

И это дало мненекоторый успех, но ListView тогда вел себя сумасшедший таким образом, которого я даже не в состоянии описать ....

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

Попробуйте добавить его в очередь сообщений

categoryList.post(new Runnable() {
    public void run() {
        categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
    }
});

У меня это работало в ScrollView ( проверьте этот ответ ).

2 голосов
/ 16 ноября 2012

я сделал функции, которые могли бы быть полезными для других для прокрутки списка, они работают для меня в каждой версии Android, эмуляторе и устройстве, здесь itemheight - фиксированная высота просмотра в списке.

int itemheight=60;
public void scrollToY(int position)
{
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public void scrollByY(int position)
{
    position+=getListScrollY();
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public int getListScrollY()
{
    try{
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important
    View v=this.getChildAt(0);
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important
    return tempscroll;
    }catch(Exception e){}
    return 0;
}
...