2011-09-26 75 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

相关问题