2011-09-26 74 views
133

如何以編程方式滾動到ListView中的特定位置?以編程方式滾動到Android ListView中的特定位置

例如,我有一個String[] {A,B,C,D....},我需要將ListView的頂部可見項目設置爲我的String[]的索引21。

+0

可能重複[是否有可能滾動ListView到Listrow的子元素?](http://stackoverflow.com/questions/6626988/is-it-it-it-it-scroll-listview-to-a-listrows-child-element) –

+0

看到我的答案在這裏,http://stackoverflow.com/a/29345217/1881527 –

回答

353

對於直接滾動:

getListView().setSelection(21); 

對於平滑滾動:

getListView().smoothScrollToPosition(21); 
+0

酷,這正是我想要的! – Eliko

+0

非常好,非常有用,它節省了我的時間。謝謝。 –

+0

+1謝謝你!它像一個魅力一樣工作! :) – Sajmon

6

我已設置OnGroupExpandListener並覆蓋onGroupExpand()爲:

並使用setSelectionFromTop()方法,該方法 設置選定的項目並將選擇的y像素從ListView的頂部邊緣放置。 (如果在觸摸模式中,項將不被選擇,但它仍然會被適當地定位。)(機器人文檔)

yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener() 
    { 

     @Override 
     public void onGroupExpand(int groupPosition) { 

      expList.setSelectionFromTop(groupPosition, 0); 
      //your other code 
     } 
    }); 
+0

我需要在滾動lisview的同時滾動另一個視圖。使用列表視圖上的setSelectionFromTop滾動阻止使另一個視圖滾動變慢的UI線程。你能提出一些建議如何去做? – VijayRaj

56

對於滾動持續時間的SmoothScroll:

getListView().smoothScrollToPositionFromTop(position,offset,duration);

參數
位置 - >滾動到
的位置 偏移量---->滾動結束時距離視圖頂部的位置的像素距離
duration->的毫秒數時滾動

注:從API 11

HandlerExploit的答案是什麼,我一直在尋找,但我的列表視圖是相當漫長的,也有字母滾動。後來我發現,同樣的功能可以採取其他參數,以及:)


編輯:(從AFD中建議)

放置當前選擇:

int h1 = mListView.getHeight(); 
int h2 = listViewRow.getHeight(); 

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration); 
+0

工作正常。爲了改善您的答案,偏移量可按照https://stackoverflow.com/questions/5540223/center-a-listview-on-its-current-selection – AFD

+0

@AFD中所述進行計算,謝謝.... – amalBit

+2

爲什麼下來投票? – amalBit

8

把你的代碼如下,

public void timerDelayRunForScroll(long time) { 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() {   
      public void run() { 
       try { 
        lstView.smoothScrollToPosition(YOUR_POSITION); 
       } catch (Exception e) {} 
      } 
     }, time); 
    } 

和t母雞叫這種方法,

timerDelayRunForScroll(100); 

CHEERS !!!

3

使用上/下using.button

如果有人有興趣使用按鍵操作的ListView一行向上/向下處理的ListView滾動。然後。

public View.OnClickListener onChk = new View.OnClickListener() { 
      public void onClick(View v) { 

       int index = list.getFirstVisiblePosition(); 
       getListView().smoothScrollToPosition(index+1); // For increment. 

} 
}); 
+0

我只是因爲你是唯一一個能夠獲得當前位置的人而給你的投票,但是你應該改進示例。 – Panciz

+1

不錯的概念,謝謝 – Ram

-1

我發現這個解決方案允許使用兩個不同的按鈕向上和向下滾動。

正如@Nepster所建議的,我使用getFirstVisiblePosition()和getLastVisiblePosition()獲取當前位置,以編程方式實現滾動。

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list); 
    ..... 

     if (list.size() > 0) { 
      ImageButton bnt = (ImageButton) findViewById(R.id.down_action); 
      bnt.setVisibility(View.VISIBLE); 
      bnt.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){ 
         lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5); 
        }else{ 
         lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount()); 

        } 
       } 
      }); 
      bnt = (ImageButton) findViewById(R.id.up_action); 
      bnt.setVisibility(View.VISIBLE); 

      bnt.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(lwresult.getFirstVisiblePosition()>0){ 
         lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5); 
        }else{ 
         lwresult.smoothScrollToPosition(0); 
        } 

       } 
      }); 
     } 
3

如果有人找像Gmail應用程序類似的功能,

的列表視圖滾動將被定位在默認情況下到上。感謝提示。 amalBit。 只需要減去它。而已。

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      int h1 = mDrawerList.getHeight(); 
      int h2 = header.getHeight(); 
      mDrawerList.smoothScrollToPosition(h2-h1); 
     } 
    }, 1000); 
3

如果您想直接跳到在ListView所需的位置只使用

listView.setSelection(INT位置);

,如果你想順利跳轉到ListView中所需的位置只使用

listView.smoothScrollToPosition(INT位置);

1

這是我工作的。通過amalBit &墨爾本洛佩斯答案的組合

public void timerDelayRunForScroll(long time) { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {   
     public void run() { 
      try { 
        int h1 = mListView.getHeight(); 
        int h2 = v.getHeight(); 

        mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500); 

      } catch (Exception e) {} 
     } 
    }, time); 
} 

,然後調用此方法,如:

timerDelayRunForScroll(400); 
5

Listview滾動將被定位在默認情況下到上,而是要滾動,如果不可見的再使用此:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position) 
      listView1.setSelection(position); 
+0

謝謝@zalak解決我的問題,給你 –

0

其易 list-view.set selection(you pos); 或者你可以保存你的位置與sharedprefrence和當你開始活動 它得到的喜好和setseletion該int

相關問題