Программно перейдите к определенной позиции в Android ListView

Как программно прокручивать до определенной позиции в ListView?

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

Ответ 1

Для прямой прокрутки:

getListView().setSelection(21);

Для гладкой прокрутки:

getListView().smoothScrollToPosition(21);

Ответ 2

Для SmoothScroll с длительностью прокрутки:

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

Параметры
position → Позиция для прокрутки до
offset ---- > Желаемое расстояние в пикселях позиции вверху представления при завершении прокрутки
duration- > Число миллисекунд, используемых для прокрутки

Примечание. От API 11.

Ответ HandlerExploit был тем, что я искал, но мой список довольно длинный, а также с помощью скроллера алфавита. Затем я обнаружил, что одна и та же функция может принимать и другие параметры:)


Изменить: (из предложения AFD)

Чтобы поместить текущий выбор:

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

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

Ответ 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);

CHEERS!!!

Ответ 4

Я установил 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
        }
    });

Ответ 5

Прокрутка Listview по умолчанию будет располагаться сверху, но вам нужно прокрутить, если она не видна, затем используйте это:

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

Ответ 6

Обработка прокрутки listView с помощью кнопки UP/Down using.button

Если кто-то заинтересован в обработке listView одной строки вверх/вниз с помощью кнопки. Затем.

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

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

}
});

Ответ 7

Если кто-то ищет аналогичную функциональность, такую ​​как приложение 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);

Ответ 8

Если вы хотите перейти непосредственно в нужную позицию в спискеView, просто используйте

listView.setSelection(int position);

и если вы хотите плавно перейти в нужную позицию в спискеView, просто используйте

listView.smoothScrollToPosition(int position);

Ответ 9

Это то, что сработало для меня. Сочетание ответов 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);

Ответ 10

Я нашел это решение, чтобы прокрутка вверх и вниз с помощью двух разных кнопок.

Как было предложено @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);
                    }

                }
            });
        }