【问题标题】:Programmatically scroll to a specific position in an Android ListView以编程方式滚动到 Android ListView 中的特定位置
【发布时间】:2011-11-25 13:21:48
【问题描述】:

如何以编程方式滚动到 ListView 中的特定位置?

例如,我有一个String[] {A,B,C,D....},我需要将ListView 的顶部可见项设置为我的String[] 的索引21。

【问题讨论】:

标签: android android-listview


【解决方案1】:

对于直接滚动:

getListView().setSelection(21);

为了平滑滚动:

getListView().smoothScrollToPosition(21);

【讨论】:

  • 酷,这正是我想要的!
  • 太好了,非常有用。它节省了我的时间。谢谢。
  • 另一个区别:第一个尝试设置在列表的中间。
  • smoothScrollToPosition 不起作用,有什么建议吗?
  • @SweetWisherツ 尝试发布延迟执行,例如:listView.post(() -> listView.smoothScrollToPosition());
【解决方案2】:

对于具有滚动持续时间的 SmoothScroll:

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

参数
position -> 要滚动到的位置
偏移量---->滚动完成时距离视图顶部的位置像素所需的距离
duration-> 用于滚动的毫秒数

注意:来自 API 11。

HandlerExploit 的答案是我一直在寻找的,但我的列表视图很长,而且还带有字母滚动条。然后我发现同一个函数也可以带其他参数:)


编辑:(来自 AFD 的建议)

定位当前选择:

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

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

【讨论】:

【解决方案3】:

将您的代码按如下方式放入处理程序中,

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); 
    }

然后像这样调用这个方法,

timerDelayRunForScroll(100);

干杯!!!

【讨论】:

    【解决方案4】:

    默认情况下Listview 滚动将定位到顶部,但如果不可见则想要滚动然后使用这个:

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

    【讨论】:

    • 谢谢@zalak 解决我的问题,放弃
    【解决方案5】:

    我已设置 OnGroupExpandListener 并将 onGroupExpand() 覆盖为:

    并使用 setSelectionFromTop() 方法 设置所选项目并从 ListView 的顶部边缘定位选择 y 像素。 (如果处于触摸模式,该项目将不会被选中,但仍会被正确定位。)(android 文档)

        yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
        {
    
            @Override
            public void onGroupExpand(int groupPosition) {
    
                expList.setSelectionFromTop(groupPosition, 0);
                //your other code
            }
        });
    

    【讨论】:

    • 我需要在滚动 lisview 的同时滚动另一个视图。在 listview 上使用 setSelectionFromTop 进行滚动会阻塞 UI 线程,这会使另一个视图的滚动变慢。可以给点建议吗?
    【解决方案6】:

    如果有人正在寻找类似 Gmail 应用的功能,

    默认情况下,Listview 滚动将定位到顶部。感谢您的提示。 阿马尔比特。 只需减去它。就是这样。

     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);
    

    【讨论】:

      【解决方案7】:

      如果你想直接跳转到 listView 中的所需位置,只需使用

      listView.setSelection(int position);

      如果您想在 listView 中顺利跳转到所需位置,只需使用

      listView.smoothScrollToPosition(int position);

      【讨论】:

        【解决方案8】:

        使用 UP/Down 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. 
        
        }
        });
        

        【讨论】:

        • 我给你投票只是因为你是唯一一个展示了获得当前位置的方法的人,但你应该改进示例。
        【解决方案9】:

        这对我有用。 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);
        

        【讨论】:

          【解决方案10】:

          这很容易 list-view.set selection(you pos); 或者您可以使用SharedPreference 保存您的位置,并在您开始活动时 它得到偏好和setSeletion 到那个int

          【讨论】:

          • 我想要做的就是自动移动到列表的顶部,没有任何滚动动画......这非常适合
          【解决方案11】:

          -如果您只想让列表向上\黎明滚动到特定位置:

          myListView.smoothScrollToPosition(i);
          

          -如果要获取特定项在myListView中的位置:

          myListView.getItemAtPosition(i);
          

          -这个myListView.getVerticalScrollbarPosition(i);can 也可以帮助你。

          祝你好运:)

          【讨论】:

            【解决方案12】:

            你需要两件事来精确定义 listView 的滚动位置:

            获取当前listView的滚动位置:

            int firstVisiblePosition = listView.getFirstVisiblePosition(); 
            int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
            

            设置listView的滚动位置:

            listView.setSelectionFromTop(firstVisiblePosition,0);
            // Note the '-' sign for scrollTo.. 
            listView.scrollTo(0,-topEdge);
            

            【讨论】:

              【解决方案13】:

              我发现这个解决方案允许使用两个不同的按钮向上和向下滚动。

              根据@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);
                                  }
              
                              }
                          });
                      }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-29
                • 1970-01-01
                • 2017-09-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多