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

时间:2011-09-26 21:09:10

标签: android android-listview

如何以编程方式滚动到ListView

中的特定位置

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

13 个答案:

答案 0 :(得分:370)

直接滚动:

getListView().setSelection(21);

顺畅滚动:

getListView().smoothScrollToPosition(21);

答案 1 :(得分:60)

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

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

  

参数
  位置 - >滚动到
的位置   offset ---->滚动结束时从视图顶部开始的位置像素的所需距离
  duration->用于滚动的毫秒数

注意:来自API 11。

HandlerExploit的回答是我正在寻找的,但是我的列表视图非常冗长,并且还带有字母滚动条。然后我发现同样的函数也可以采用其他参数:)


编辑(来自AFDs建议)

定位当前选择:

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

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

答案 2 :(得分:9)

将您的代码置于处理程序中,如下所示,

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

CHEERS !!!

答案 3 :(得分:6)

我已设置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
        }
    });

答案 4 :(得分:6)

默认情况下,Listview滚动条将定位到顶部,但如果不可见则要滚动,请使用此选项:

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

答案 5 :(得分:4)

  

使用UP / Down using.button处理listView滚动

如果有人有兴趣使用按钮向上/向下处理listView一行。然后

indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")), lapply(splitCols, function(x) indt[[x]]))]

答案 6 :(得分:4)

如果有人在寻找类似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);

答案 7 :(得分:3)

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

listView.setSelection(int position);

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

listView.smoothScrollToPosition(int position);

答案 8 :(得分:3)

这对我有用。 amalBit&amp;的答案组合墨尔本洛佩斯

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

答案 9 :(得分:1)

很容易 list-view.set selection(you pos); 或者您可以使用sharedprefrence和开始活动时保存您的位置 它得到了int的首选项和setseletion

答案 10 :(得分:1)

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

myListView.smoothScrollToPosition(i);

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

myListView.getItemAtPosition(i);

-此myListView.getVerticalScrollbarPosition(i);也会为您提供帮助。

祝你好运:)

答案 11 :(得分: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);

答案 12 :(得分:-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);
                    }

                }
            });
        }