Android – первая видимая позиция ListView не обновляется

Итак, у меня есть ListView, а также кнопки вверх и вниз.

Моя цель - прокручивать ListView по высоте каждый раз, когда я нажимаю одну из кнопок, простая навигация вверх/вниз.

Прокрутка вроде работает. Когда я нажимаю вниз, ListView прокручивается на правильное расстояние каждый раз, когда он прокручивается.

Однако только кнопка вверх работает по назначению. Кнопка «Вниз» имеет проблемы, которые, как мне кажется, связаны с первой видимой позицией прокрутки ListView, которая не обновляется.

Когда я нажимаю вниз, вызывается метод onNavigationDownPressed(), как показано ниже. Это прокручивает правильное количество вниз ListView с начальным ListView firstVisiblePosition в 0. В следующий раз, когда этот метод вызывается, первой видимой позицией будет по-прежнему 0.

Но если я вручную прокручиваю ListView немного вниз, а затем нажимаю вниз, он правильно прокручивается вниз, а затем то же самое, он больше не будет опускаться из-за того, что firstVisiblePostion не изменится, если я сначала не прокрутлю, чтобы сделать обновление позиции.

// Scroll up
@Override
public void onNavigationUpPressed()
{       
    Log.i("MAKE UP, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));     
    listView.setSelectionFromTop(listView.getFirstVisiblePosition(), fragmentHeight);
}

// Scroll down
@Override
public void onNavigationDownPressed()
{
    Log.i("MAKE DOWN, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));       
    listView.setSelectionFromTop(listView.getFirstVisiblePosition(), -fragmentHeight);
}   

Любые идеи?

Ваше здоровье


person mgibson    schedule 24.05.2013    source источник


Ответы (2)


Возможно, вам стоит попробовать позвонить:

listView.smoothScrollToPosition(yourPosition);

Другой способ - вручную установить прокрутку элементов, но первый подход должен работать для вас.

person Pavel Lahoda    schedule 18.07.2013
comment
Извините, мой плохой, я хотел сказать, что на это был дан ответ - ура в любом случае - person mgibson; 18.07.2013

Решение:

Я установил onScrollListener для ListView, который уведомлял меня как о прокрутке ListView, так и о некоторых других удобных параметрах, таких как индекс первого видимого элемента, общее количество элементов, видимых на экране и т. д., поэтому я сохранил эти переменные.

    listView.setOnScrollListener(new OnScrollListener()
    {           
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
        {
            Log.i("MMY: ", "Scroll");
            Log.i("MMY: ", "First visible item: " + String.valueOf(firstVisibleItem));
            Log.i("MMY: ", "Visible item count: " + String.valueOf(visibleItemCount));

            // The variables that belong to this class now equal ->
            General_Navigation_Fragment.this.visibleItemCount = visibleItemCount;
            General_Navigation_Fragment.this.firstVisibleItem = firstVisibleItem;

            totalCount = totalItemCount;                
        }
    });

Когда была нажата кнопка «вниз», я получил индекс первого видимого элемента и количество видимых элементов (n) на экране, а затем прокрутил вниз до текущей позиции + n. Просто сделал обратное для прокрутки вверх.

// Scroll up
@Override
public void onNavigationUpPressed()
{           
    currentVisibleItem = firstVisibleItem - visibleItemCount;

    if (currentVisibleItem < 0)
    {
        listView.setSelection(0);
    }
    else        
        listView.setSelection(currentVisibleItem - 1);
}

// Scroll down
@Override
public void onNavigationDownPressed()
{           
    currentVisibleItem = visibleItemCount + firstVisibleItem;

    listView.setSelection(currentVisibleItem - 1);  
}   

Поскольку в моем ListView есть элементы разного размера, этот способ кажется самым простым.

person mgibson    schedule 18.07.2013