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


Answers:


386

直接滚动:

getListView().setSelection(21);

为了平滑滚动:

getListView().smoothScrollToPosition(21);

太酷了,这正是我想要的!
jiasli

太好了,非常有用。它可以节省我的时间。谢谢。
Neha Agarwal

另一个区别:第一个尝试设置在列表中间。
维克托·平托2014年

11
smoothScrollToPosition不起作用,有什么建议吗?
SweetWisher 2015年

1
@SweetWisherツ尝试发布延迟执行的消息,例如:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

对于具有滚动持续时间的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);  

工作良好。为了改善您的答案,可以按照stackoverflow.com/questions/5540223/…
AFD 2014年

v.getHeight()是什么?
Panache

@Panache v是列表视图的行
amalBit '18

我爱你uuuuuu
Joao Ferreira

10

将代码放入处理程序,如下所示:

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

干杯!!!


7

我设置了OnGroupExpandListener并将onGroupExpand()重写为:

并使用setSelectionFromTop()方法设置选定的项目,并将选择的y像素从ListView的顶部边缘定位。(如果处于触摸模式,则不会选择该项目,但仍会适当放置它。)(android docs)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

我需要在滚动lisview的同时滚动另一个视图。在列表视图上使用setSelectionFromTop进行滚动会阻塞UI线程,这会使另一个视图的滚动变慢。您能提出一些建议吗?
VijayRaj 2014年

7

Listview卷轴将被定位在默认情况下顶部,但要滚动如果不可见然后使用此:

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

感谢@zalak解决我的问题,给你了
Mitul Bhadeshiya

5

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

默认情况下,Listview滚动条将位于顶部。感谢您的提示。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);

4

处理listView使用UP / Down按钮滚动

如果有人对处理列表感兴趣,请使用按钮上/下一行。然后。

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

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

}
});

我之所以投票赞成,是因为您是唯一一个获得当前职位的方式的人,但是您应该改善榜样。
Panciz 2015年

4

如果要直接跳到listView中的所需位置,请使用

listView.setSelection(int position);

如果您想平稳地跳转到listView中的所需位置,请使用

listView.smoothScrollToPosition(int position);


3

这对我有用。amalBit和Melbourne Lopes的答案组合

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

1

它很容易list-view.set选择(你pos);或者您可以使用共享偏好保存位置,并且在开始活动时会获得该int的首选项和设置


我想要做的就是自动移到列表顶部,没有任何滚动动画...这非常适合
RH201

1

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

myListView.smoothScrollToPosition(i);

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

myListView.getItemAtPosition(i);

-这myListView.getVerticalScrollbarPosition(i);也可以为您提供帮助。

祝好运 :)


0

您需要两件事来精确定义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);

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

                }
            });
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.