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


157

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

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



Ответы:


386

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

getListView().setSelection(21);

Для плавной прокрутки:

getListView().smoothScrollToPosition(21);

Круто, это именно то, что я хочу!
Jiasli

Отлично, очень полезно. Это экономит мое время. Спасибо.
Неха Агарвал

Еще одно отличие: первый пытается установить в середине списка.
Виктор Пинто

11
smoothScrollToPositionне работает, любое предложение?
SweetWisher ツ

1
@SweetWisher ツ попробуйте опубликовать задержку выполнения, что-то вроде:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

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

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

Параметры
position -> Position для прокрутки до
смещения ----> Желаемое расстояние в пикселях от позиции от верхней части представления, когда прокрутка завершена,
продолжительность -> Количество миллисекунд, используемых для прокрутки

Примечание: из 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

@Panache v - строка списка
amalBit

я люблю тебя
Жуан Феррейра,

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

CHEERS !!!


7

Я установил OnGroupExpandListener и переопределил onGroupExpand () как:

и использовать метод setSelectionFromTop (), который устанавливает выбранный элемент и размещает выделенные пиксели y от верхнего края ListView. (Если в сенсорном режиме, элемент не будет выбран, но он все равно будет располагаться соответствующим образом.) (Документы для Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

Мне нужно прокрутить другой вид одновременно при прокрутке lisview. Использование setSelectionFromTop в listview для прокрутки блокирует поток пользовательского интерфейса, что замедляет прокрутку другого представления. Можете ли вы дать совет, как это сделать?
VijayRaj

7

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

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

Спасибо @zalak Решите мою проблему,
откажитесь

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 с помощью .button

Если кто-то заинтересован в обработке списка, просмотрите одну строку вверх / вниз, используя кнопку. затем.

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

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

}
});

Я голосую за вас только потому, что вы единственный, кто показал способ получить текущую позицию, но вы должны улучшить пример.
Панцис

4

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

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 (вы поз); или вы можете сохранить свою позицию с помощью sharedprefrence, и, когда вы начинаете деятельность, она получает настройки и выбирает этот 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);
                    }

                }
            });
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.