簡體   English   中英

以編程方式滾動到 Android ListView 中的特定位置

[英]Programmatically scroll to a specific position in an Android ListView

如何以編程方式滾動到ListView的特定位置?

例如,我有一個String[] {A,B,C,D....} ,我需要將ListView的頂部可見項設置為我的String[]的索引 21。

對於直接滾動:

getListView().setSelection(21);

對於平滑滾動:

getListView().smoothScrollToPosition(21);

對於帶有 Scroll 持續時間的 SmoothScroll:

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

參數
位置 -> 滾動到的位置
偏移 ----> 滾動完成時與視圖頂部位置的期望距離(以像素為單位)
持續時間-> 用於滾動的毫秒數

注意:來自 API 11。

HandlerExploit 的答案正是我要找的,但我的列表視圖很長,而且還帶有字母滾動條。 然后我發現同一個函數也可以帶其他參數:)


編輯:(來自 AFDs 的建議)

定位當前選擇:

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

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

將您的代碼放入處理程序中,如下所示,

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

干杯!!!

默認情況下, Listview滾動將定位到頂部,但如果不可見則要滾動,然后使用:

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

我已設置 OnGroupExpandListener 並將 onGroupExpand() 覆蓋為:

並使用 setSelectionFromTop() 方法設置所選項目並從 ListView 的頂部邊緣定位選擇 y 像素。 (如果在觸摸模式下,該項目將不會被選中,但仍會被適當定位。)(android 文檔)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

如果有人正在尋找類似 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);

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

listView.setSelection(int position);

如果你想平滑地跳轉到 listView 中所需的位置,只需使用

listView.smoothScrollToPosition(int position);

使用 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. 

}
});

這對我有用。 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);

很容易list-view.set selection(you pos); 或者你可以用SharedPreference保存你的位置,當你開始活動時,它會得到偏好並將setSeletion設置為該 int

- 如果您只想將列表向上\\黎明滾動到特定位置:

myListView.smoothScrollToPosition(i);

- 如果你想在 myListView 中獲取特定項目的位置:

myListView.getItemAtPosition(i);

-還有這個myListView.getVerticalScrollbarPosition(i); 可以幫助你。

祝你好運 :)

您需要做兩件事來精確定義 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);

我發現這個解決方案允許使用兩個不同的按鈕上下滾動。

正如@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);
                    }

                }
            });
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM