package io.github.javiewer.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.List; import io.github.javiewer.adapter.MovieAdapter; import io.github.javiewer.adapter.item.Movie; import io.github.javiewer.network.provider.AVMOProvider; import io.github.javiewer.view.decoration.MovieItemDecoration; import io.github.javiewer.view.listener.EndlessOnScrollListener; import jp.wasabeef.recyclerview.adapters.SlideInBottomAnimationAdapter; import jp.wasabeef.recyclerview.animators.SlideInUpAnimator; import okhttp3.ResponseBody; import retrofit2.Call; public abstract class MovieFragment extends RecyclerFragment<Movie, LinearLayoutManager> { public MovieFragment() { // Required empty public constructor } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { this.setLayoutManager(new LinearLayoutManager(this.getContext())); mRecyclerView.addItemDecoration(new MovieItemDecoration()); this.setAdapter(new SlideInBottomAnimationAdapter(new MovieAdapter(getItems(), this.getActivity()))); RecyclerView.ItemAnimator animator = new SlideInUpAnimator(); animator.setAddDuration(300); mRecyclerView.setItemAnimator(animator); this.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { getOnScrollListener().refresh(); } }); this.addOnScrollListener(new EndlessOnScrollListener<Movie>() { @Override public Call<ResponseBody> newCall(int page) { return MovieFragment.this.newCall(page); } @Override public RecyclerView.LayoutManager getLayoutManager() { return MovieFragment.this.getLayoutManager(); } @Override public SwipeRefreshLayout getRefreshLayout() { return MovieFragment.this.mRefreshLayout; } @Override public List<Movie> getItems() { return MovieFragment.this.getItems(); } @Override public RecyclerView.Adapter getAdapter() { return MovieFragment.this.getAdapter(); } @Override public void onResult(ResponseBody response) throws Exception { super.onResult(response); List<Movie> wrappers = AVMOProvider.parseMovies(response.string()); int pos = getItems().size(); getItems().addAll(wrappers); getAdapter().notifyItemRangeInserted(pos, wrappers.size()); } }); mRefreshLayout.post(new Runnable() { @Override public void run() { mRefreshLayout.setRefreshing(true); getOnRefreshListener().onRefresh(); } }); super.onActivityCreated(savedInstanceState); } public abstract Call<ResponseBody> newCall(int page); }