以编程方式滚动到 Android ListView 中的特定位置

Posted

技术标签:

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

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

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

【问题讨论】:

Is it possible to scroll ListView to a listrow's child element?的可能重复 在这里查看我的答案,***.com/a/29345217/1881527 【参考方案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);  

【讨论】:

工作正常。为了改善您的答案,可以按照***.com/questions/5540223/… 中的说明计算偏移量 什么是 v.getHeight()? @Panache v 是列表视图的行【参考方案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);
                    

                
            );
        

【讨论】:

以上是关于以编程方式滚动到 Android ListView 中的特定位置的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式防止滚动列表视图颤动

ExtJs 3.x 以编程方式滚动 ListView

按钮按下以编程方式将新行添加到 ListView,如何?

Android Drag-Sort-Listview - 以编程方式启动拖放

以编程方式滚动到可扩展列表视图的底部,最后一项内容很大

如何以编程方式滚动 Android WebView