Как сохранить позицию в InfiniteListView?

187
23 августа 2017, 15:55

Есть следующая библиотека: https://github.com/ugurcany/InfiniteListView

Вкратце, она позволяет сделать ListView с бесконечным скроллом и обновлением, как это реализовано во Вконтакте. Вопрос состоит в том, как правильно восстанавливать состояние этого ListView при смене конфигурации экрана.

Глянул что там внутри: Этот класс держит внутри себя ListView

public class InfiniteListView<T> extends FrameLayout {
    private SwipeRefreshLayout swipeRefreshLayout;
    private ListView listView;
    private boolean loading = false;
    private View loadingView;
    private boolean hasMore = false;
    private InfiniteListAdapter infiniteListAdapter;

И назначает ему адаптер

public void setAdapter(InfiniteListAdapter<T> infiniteListAdapter) {
        this.infiniteListAdapter = infiniteListAdapter;
        this.listView.setAdapter(infiniteListAdapter);
        this.listView.setOnScrollListener(new OnScrollListener() {
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if(InfiniteListView.this.hasMore) {
                    int lastVisibleItem = visibleItemCount + firstVisibleItem;
                    if(lastVisibleItem >= totalItemCount && !InfiniteListView.this.loading) {
                        InfiniteListView.this.infiniteListAdapter.onNewLoadRequired();
                    }
                }
            }
        });
        this.listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                InfiniteListView.this.infiniteListAdapter.onItemClick(position);
            }
        });
        this.listView.setOnItemLongClickListener(new OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                InfiniteListView.this.infiniteListAdapter.onItemLongClick(position);
                return true;
            }
        });
    }

Как видно, там ставится кастомный OnScrollListener, который, в принципе, мне был бы полезен. Я бы на onScroll брал позицию firstVisibleItem и сохранял бы ее куда-нибудь, на время пересоздания экрана, а потом как-нибудь бы проскроливал до этой позиции, но проблема в том, что у всего класса InfiniteListView поля приватные, кроме того, он наследуется от FrameLayout'а.

Я пытался сделать что-то типа такого:

public class MyInfiniteListView extends InfiniteListView{

    public MyInfiniteListView(Context context){
        super(context);
    }
    public MyInfiniteListView(Context context, AttributeSet attrs){
        super(context, attrs);
    }
    public MyInfiniteListView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }
    @Override
    public void setAdapter(InfiniteListAdapter infiniteListAdapter){
        super.setAdapter(infiniteListAdapter);
        super.listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if(InfiniteListView.super.hasMore) {
                    int lastVisibleItem = visibleItemCount + firstVisibleItem;
                    if(lastVisibleItem >= totalItemCount && !InfiniteListView.super.loading) {
                        InfiniteListView.super.infiniteListAdapter.onNewLoadRequired();
                    }
                }
            }
        });
    }
}

Т.е. переопределить хотя бы 1 метод, но сделать этого нельзя ввиду того, что listView- приватное поле. Как выкручиваться? Ведь судя по всему, у Вконтакте именно эта библиотека (Даже реализация всех анимаций идентичная) и у них сохранение при смене конфигурации присутствует.

P.S. Реверс-инжирингом не хотелось бы заниматься, но если вариантов не будет- полезу внутрь приложения ВК.

READ ALSO
ошибка при отправке сообщения smtp (javaMail)

ошибка при отправке сообщения smtp (javaMail)

Пишу рассылку для клиентов, при использовании ящика gmail или mail, да даже rambler, сообщения передаются, но при попытке использовать корпоративную...

250
Правильно ли реализована инкапсуляция?

Правильно ли реализована инкапсуляция?

Правильно ли я реализовал инкапсуляцию в этом примере:

203
slick slider наложение элементов

slick slider наложение элементов

Как исправить наложение dots друг на друга? задавал отступы в pager__item , не помогает https://codepenio/st-iv/pen/PKQWMJ

295
Как преобразовать один вид ссылки в другую VK

Как преобразовать один вид ссылки в другую VK

Вообщем у меня в программе я получаю ссылки вот такого вида

207