Android ListView задача: видимо 3 элемента, остальное скрол?

Доброе время суток вам люди...
Собственно задача описанна в вопросе. Cуть решения мне понятна - нужен custom адаптер в котором это реализуется. Есть возможность получить видимые элементы(первый, последний, общее число элементов и т.д. в onScroll), вроде простая проверка(>/= 3) и делаем setVisibility(View.HIDE/VISIBLE), но хоть убей уже третий день не могу этого сделать, не то, что найти пример в google...
я только второй месяц провел вместе с Android/Java и возможно моя проблема и не проблема совсем. Но может кто то умеет показать пример того, как это сделать.
  • Вопрос задан
  • 3703 просмотра
Решения вопроса 1
itspers
@itspers
Вам нужен просто scroll listener.

1. Делаяете какой-нить метод который будет загружать\брать из базы данные с параметром пагинации.

2. По умолчанию он грузит первую страницу, допустим 3 элемента, парсит там что надо, скармливает обычному адаптеру и т.п.

3. Цепляем к нему листенер

public class EndlessScrollListener implements OnScrollListener {

        private int visibleThreshold = 5;
        private int currentPage = 0;
        private int previousTotal = 0;
        private boolean loading = true;

        public EndlessScrollListener() {
        }
        public EndlessScrollListener(int visibleThreshold) {
            this.visibleThreshold = visibleThreshold;
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                    currentPage++;
                }
            }
            if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                // I load the next page of gigs using a background task,
                // but you can call any function here.
                new LoadGigsTask().execute(currentPage + 1);
                loading = true;
            }
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }
    }


GigList.setOnScrollListener(new EndlessScrollListener());


benjii.me/2010/08/endless-scrolling-listview-in-android

4. Он при скролле будет инкрементить currentPage, и, там, где в примере new LoadGigsTask().execute(currentPage + 1), вызываете свой метод, который будет грузить уже не 3, а 6, 9, 12 и загружать это дело в адапатер.

Там уже в зависимости от того из базы эти данные, из провайдера или из интеренета - логика может слегка меняться, но суть всегда одна - листенер на скролл, который помнит текущую страницу.

UPD: не нужно грузить 100, показывать 3, а 97 прятать - если юзеру для начала нужно 3 - то и грузить надо ровно 3.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlexRudkowskij
Студент
А почему бы не измерить размер одного поля(элемента списка) и поставить размер в ListView равному размер_поля*3. Тогда будет видно только три, остальные будут скролится. Или такое не подходит?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы