package fr.ydelouis.selfoss.adapter; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.support.v13.app.FragmentPagerAdapter; import org.androidannotations.annotations.AfterInject; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.UiThread; import java.util.ArrayList; import java.util.List; import fr.ydelouis.selfoss.entity.Article; import fr.ydelouis.selfoss.entity.Filter; import fr.ydelouis.selfoss.fragment.ArticleFragment; import fr.ydelouis.selfoss.fragment.ArticleFragment_; import fr.ydelouis.selfoss.model.ArticleProvider; @EBean public class ArticlePagerAdapter extends FragmentPagerAdapter implements ArticleProvider.Listener { @Bean protected ArticleProvider provider; private List<Article> articles = new ArrayList<Article>(); private ArticleFragment.ScrollListener scrollListener; public ArticlePagerAdapter(Context context) { super(((Activity) context).getFragmentManager()); } @AfterInject protected void init() { provider.setListener(this); } public void setFilter(Filter filter) { provider.setFilter(filter); } public void setArticle(Article article) { articles.clear(); articles.add(article); provider.loadNew(article); } public void setScrollListener(ArticleFragment.ScrollListener scrollListener) { this.scrollListener = scrollListener; } @Override public void onNewLoaded(List<Article> newArticles) { if (newArticles != null) { articles.addAll(0, newArticles); } } public int getPosition(Article article) { return articles.indexOf(article); } public Article getArticle(int position) { return articles.get(position); } @Override public Fragment getItem(int position) { if (isNewPageNeeded(position)) { loadNextArticles(); } ArticleFragment fragment = ArticleFragment_.builder().article(getArticle(position)).build(); fragment.setScrollListener(scrollListener); return fragment; } private boolean isNewPageNeeded(int position) { return position == getCount()-1; } @Background protected void loadNextArticles() { int count = getCount(); Article lastArticle = null; if (count > 0) { lastArticle = getArticle(count - 1); } provider.loadNext(count, lastArticle); } @Override public int getCount() { return articles.size(); } @Override @UiThread public void onNextLoaded(List<Article> nextArticles) { if (nextArticles != null) { for (Article article : nextArticles) { if (!articles.contains(article)) { articles.add(article); } } if (!nextArticles.isEmpty()) { notifyDataSetChanged(); } } } }