2010-11-24 58 views
3

我有一個LinearLayout,其中包含一些其他意見和其中一個ListView。 此視圖是通過單擊按鈕從另一個視圖加載的。Android ListView scrollTo

此按鈕以某種方式指定ListView中的哪些元素需要是列表中的第一個可見元素。填充列表的元素是通過來自外部服務器的HTTP檢索的。

問題是我可以得到第N個元素成爲列表中的第一個元素。 請注意,我不想將它從當前位置移動到新位置,我希望列表滾動。

我試過setSelected()scrollTo(x,y)scrollBy(x,y)但沒有運氣。

我也做了嘗試這個PICE的代碼,醜陋的,因爲它是,但我只是想嘗試f是工作:

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控件然後以一種我甚至無法形容的方式表現瘋狂 ....

任何想法?

回答

4

嘗試將其添加到消息隊列

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

它在滾動型工作對我來說(check this answer)。

+0

這個工作,非常感謝! – 0m4r 2010-11-28 16:27:36

2

我做了一些功能,可以爲其他人使用listview滾動,他們爲我在每個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; 
}