Есть следующая библиотека: 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. Реверс-инжирингом не хотелось бы заниматься, но если вариантов не будет- полезу внутрь приложения ВК.
Продвижение своими сайтами как стратегия роста и независимости