package me.ccrama.redditslide.Fragments; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import me.ccrama.redditslide.Activities.Profile; import me.ccrama.redditslide.Adapters.ContributionAdapter; import me.ccrama.redditslide.Adapters.ContributionPosts; import me.ccrama.redditslide.Adapters.ContributionPostsSaved; import me.ccrama.redditslide.Constants; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager; import me.ccrama.redditslide.Views.PreCachingLayoutManager; import me.ccrama.redditslide.Visuals.Palette; import me.ccrama.redditslide.handler.ToolbarScrollHideHandler; public class ContributionsView extends Fragment { private int totalItemCount; private int visibleItemCount; private int pastVisiblesItems; private ContributionAdapter adapter; private ContributionPosts posts; private String id; private String where; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_verticalcontent, container, false); final RecyclerView rv = ((RecyclerView) v.findViewById(R.id.vertical_content)); final PreCachingLayoutManager mLayoutManager; mLayoutManager = new PreCachingLayoutManager(getContext()); rv.setLayoutManager(mLayoutManager); rv.setItemViewCacheSize(2); v.findViewById(R.id.post_floating_action_button).setVisibility(View.GONE); final SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.activity_main_swipe_refresh_layout); mSwipeRefreshLayout.setColorSchemeColors(Palette.getColors(id, getActivity())); //If we use 'findViewById(R.id.header).getMeasuredHeight()', 0 is always returned. //So, we estimate the height of the header in dp mSwipeRefreshLayout.setProgressViewOffset(false, Constants.TAB_HEADER_VIEW_OFFSET - Constants.PTR_OFFSET_TOP, Constants.TAB_HEADER_VIEW_OFFSET + Constants.PTR_OFFSET_BOTTOM); mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(true); } }); if (where.equals("saved") && getActivity() instanceof Profile) posts = new ContributionPostsSaved(id, where, ((Profile) getActivity()).category); else posts = new ContributionPosts(id, where); //noinspection StringEquality if (where == "hidden") adapter = new ContributionAdapter(getActivity(), posts, rv, true); else adapter = new ContributionAdapter(getActivity(), posts, rv); rv.setAdapter(adapter); posts.bindAdapter(adapter, mSwipeRefreshLayout); //TODO catch errors mSwipeRefreshLayout.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { posts.loadMore(adapter, id, true); //TODO catch errors } } ); rv.addOnScrollListener(new ToolbarScrollHideHandler((Toolbar) getActivity().findViewById(R.id.toolbar), getActivity().findViewById(R.id.header)) { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); visibleItemCount = rv.getLayoutManager().getChildCount(); totalItemCount = rv.getLayoutManager().getItemCount(); if (rv.getLayoutManager() instanceof PreCachingLayoutManager) { pastVisiblesItems = ((PreCachingLayoutManager) rv.getLayoutManager()).findFirstVisibleItemPosition(); } else { int[] firstVisibleItems = null; firstVisibleItems = ((CatchStaggeredGridLayoutManager) rv.getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItems); if (firstVisibleItems != null && firstVisibleItems.length > 0) { pastVisiblesItems = firstVisibleItems[0]; } } if (!posts.loading) { if ((visibleItemCount + pastVisiblesItems) + 5 >= totalItemCount && !posts.nomore) { posts.loading = true; posts.loadMore(adapter, id, false); } } } }); return v; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = this.getArguments(); id = bundle.getString("id", ""); where = bundle.getString("where", ""); } }