2010-11-24 11 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(); 

       } 
      } 
     }); 

そして、これは私にいくつかの成功が、リストビューを与えましたその後、私は説明することさえできないように、クレイジーのように振る舞いました。

何か考えですか?

答えて

4

は、それはScrollViewに私のために働いたメッセージキュー

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

check this answer)に追加してください。

+0

これはうまくいきました。 – 0m4r

+0

私もsetSelectedで試してみましたが、うまくいきました。だから私は私の問題に対する解決策を見つけました!私が明確に理解していないことは、なぜこれが機能するのかです:/ – 0m4r

2

私はリストビューのスクロールのために他の人にとって有益な機能を作ってくれました。それらはすべてのアンドロイド版、エミュレータ、デバイスで私のために働いています。ここで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; 
}