Програмно прокрутіть до конкретної позиції в Android ListView


157

Як я можу програмно прокручуватися до певної позиції у ListView?

Наприклад, у мене є String[] {A,B,C,D....}, і мені потрібно встановити верхній видимий елемент ListViewв індекс 21 мого String[].



дивіться мою відповідь тут, stackoverflow.com/a/29345217/1881527
Мельбурн Лопес

Відповіді:


386

Для прямого прокручування:

getListView().setSelection(21);

Для плавного прокручування:

getListView().smoothScrollToPosition(21);

Класно, це саме те, що я хочу!
jiasli

Чудово, дуже корисно. Це заощадить мій час. Дякую.
Neha Agarwal

Ще одна відмінність: перша намагається встановити в середині списку.
Віктор Пінто

11
smoothScrollToPositionне працює, будь-яка пропозиція?
SweetWisher ツ

1
@SweetWisher ツ спробуйте відкласти затримку виконання, на кшталт:listView.post(() -> listView.smoothScrollToPosition());
Енді Рез

64

Для 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);  

Добре працює. Щоб покращити свою відповідь, компенсацію можна обчислити так, як описано на stackoverflow.com/questions/5540223/…
AFD

що таке v.getHeight ()?
Панаш

@Panache v - це рядок
списку перегляду

я люблю youuuuuu
Жоао Феррейра

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. (Якщо в режимі дотику, елемент не буде обраний, але він все ще буде розташований належним чином.) (Андроїд документи)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

Мені потрібно одночасно прокручувати інший вигляд під час прокрутки lisview. Використання setSelectionFromTop для перегляду списку для прокрутки блокує потік інтерфейсу, що робить прокрутку іншого виду повільним. Чи можете ви дати якусь пропозицію, як це зробити?
VijayRaj

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

Обробка спискуПерегляд прокрутки за допомогою кнопок Вгору / Вниз

Якщо хтось зацікавлений в обробці списку, перегляньте один рядок вгору / вниз за допомогою кнопки. тоді.

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

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

}
});

Я даю тобі голос лише тому, що ти єдиний, хто показав спосіб отримати поточну позицію, але ти повинен покращити приклад.
Panciz

4

Якщо ви хочете перейти безпосередньо до потрібної позиції у спискуView просто скористайтеся

listView.setSelection (позиція int);

і якщо ви хочете плавно перейти до потрібного положення в listView, просто скористайтеся

listView.smoothScrollToPosition (позиція int);


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 (ви позуєте); або ви можете зберегти свою позицію за допомогою спільної презентаціїі, коли ви розпочали діяльність, отримайте налаштування та встановіть вибір до цього int


все, що я хотів зробити, це автоматично перейти на верхню частину списку, без будь-якої анімації прокрутки ... це було чудово для цього
RH201,

1

-Якщо ви хочете, щоб список прокручувався вгору \ світанку до певної позиції:

myListView.smoothScrollToPosition(i);

-якщо ви хочете отримати позицію певного елемента в myListView:

myListView.getItemAtPosition(i);

-так, це myListView.getVerticalScrollbarPosition(i);може вам допомогти.

Щасти :)


0

Щоб точно визначити положення прокрутки listView, потрібно дві речі:

Щоб отримати поточний списокПерегляд прокрутки:

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

Щоб встановити listView position прокрутки:

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

                }
            });
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.