andriangungon
11/30/2017 - 7:26 AM

adding load more pagination for nested scroll view

public class LatestVideosFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{

    private View view;
    private RecyclerView recyclerView;
    private FrontpageVideosAdapter latestVideosAdapter;
    private Context context;
    private SwipeRefreshLayout swipeRefreshLayout;
    private LinearLayoutManager mLayoutManager;
    ArrayList<Video> videoItem;
    private boolean loading = true;
    int pastVisiblesItems, visibleItemCount, totalItemCount;
    private int page = 2;
    NestedScrollView nestedScrollView;

    private ViewPager viewPager;
    private LinearLayout layout_dots;
    private AdapterImageSlider adapterImageSlider;
    private Runnable runnable = null;
    private Handler handler = new Handler();

    public LatestVideosFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_latest_videos, container, false);

        initialization();
        initScrollListener();
        getFeaturedVideos();
        return view;
    }

    private void initialization() {

        context = getActivity();
        videoItem = new ArrayList<>();

        swipeRefreshLayout = view.findViewById(R.id.swipe_refresh_layout);
        swipeRefreshLayout.setOnRefreshListener(this);
        swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary);

        nestedScrollView = view.findViewById(R.id.nested_scroll_view);
        recyclerView = view.findViewById(R.id.recyclerView);
        mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        swipeRefreshLayout.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        swipeRefreshLayout.setRefreshing(true);
                                        populateData();
                                    }
                                }
        );
    }

    private void initScrollListener() {

        nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

                if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) {
                    {
                        visibleItemCount = mLayoutManager.getChildCount();
                        totalItemCount = mLayoutManager.getItemCount();
                        pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

                        if (loading) {
                            if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                                //loading = false;
                                Log.v("...", "Last Item Wow !");

                                //if(page <= 2) {
                                loadMoreData(page);
                                page++;
                                //}
                            }
                        }
                    }
                }
            }
        });
    }

    private void populateData() {

        // showing refresh animation before making http call
        swipeRefreshLayout.setRefreshing(true);
        page = 2;

        LatestInterface apiService = APIClient.getClient().create(LatestInterface.class);
        Call<LatestResponse> call = apiService.getResults();
        call.enqueue(new Callback<LatestResponse>() {

            @Override
            public void onResponse(Call<LatestResponse> call, Response<LatestResponse> response) {

                if (response.isSuccessful()) {
                    try {
                        Constant.showLoading(context, "Videos are being loaded...");

                        List<LatestAPI> videos = response.body().getData();

                        videoItem.clear();
                        //latestVideosAdapter.notifyDataSetChanged();

                        for (int i = 0; i < videos.size(); i++) {
                            videoItem.add(new Video(
                                    videos.get(i).getVid_category_title(),
                                    videos.get(i).getVid_created_at(),
                                    videos.get(i).getVid_url(),
                                    videos.get(i).getVid_category_id(),
                                    videos.get(i).getVid_start(),
                                    videos.get(i).getVid_end())
                            );
                        }


                        latestVideosAdapter = new FrontpageVideosAdapter(context, videoItem);
                        recyclerView.setAdapter(latestVideosAdapter);


                        Constant.hideLoading();

                        //Toast.makeText(context, "latestVideosAdapter: " + latestVideosAdapter.getItemCount(), Toast.LENGTH_SHORT).show();

                    } catch (Throwable e) {
                        Constant.hideLoading();
                        //Constant.showGeneralWarning(context, "Error (Throwable): " + e.getMessage());
                        Log.d(TAG, "Error (Throwable): " + e.getMessage());
                    }

                    // stopping swipe refresh
                    swipeRefreshLayout.setRefreshing(false);

                } else {

                    Constant.hideLoading();

                    if(response.code() == 401){


                    }

                    Log.d(TAG, "Retrofit Failed: " + response.message());
                }

            }

            @Override
            public void onFailure(Call<LatestResponse> call, Throwable t) {

                // stopping swipe refresh
                swipeRefreshLayout.setRefreshing(false);

                Log.d(TAG, "Kapuso Error: " + t.getMessage());
            }

        });
    }

    public void loadMoreData(int page) {
        Toast.makeText(context, "loadmoredata: " + page, Toast.LENGTH_SHORT).show();

        //swipeRefreshLayout.setRefreshing(true);
        Constant.showLoading(context, "Loading videos...");
        LatestInterface apiService = APIClient.getClient().create(LatestInterface.class);
        Call<LatestResponse> call = apiService.loadMore(page);
        call.enqueue(new Callback<LatestResponse>() {

            @Override
            public void onResponse(Call<LatestResponse> call, Response<LatestResponse> response) {

                if (response.isSuccessful()) {

                    try {

                        List<LatestAPI> videos = response.body().getData();

                        for (int i = 0; i < videos.size(); i++) {
                            videoItem.add(new Video(
                                    videos.get(i).getVid_category_title(),
                                    videos.get(i).getVid_created_at(),
                                    videos.get(i).getVid_url(),
                                    videos.get(i).getVid_category_id(),
                                    videos.get(i).getVid_start(),
                                    videos.get(i).getVid_end())
                            );
                        }

                        recyclerView.setAdapter(latestVideosAdapter);
                        int curSize = latestVideosAdapter.getItemCount();
                        latestVideosAdapter.notifyItemRangeChanged(curSize, videoItem.size() - 1);

                        Constant.hideLoading();

                    } catch (Throwable e) {
                        Constant.hideLoading();
                        //Constant.showGeneralWarning(context, "Error (Throwable): " + e.getMessage());
                        Log.d(TAG, "Error (Throwable): " + e.getMessage());
                    }

                    // stopping swipe refresh
                    Constant.hideLoading();

                } else {

                    if (response.code() == 401) {

                    }

                    Log.d(TAG, "Retrofit Failed: " + response.message());
                    Constant.hideLoading();
                }

            }

            @Override
            public void onFailure(Call<LatestResponse> call, Throwable t) {

                // stopping swipe refresh
                Constant.hideLoading();
                Log.d(TAG, "Kapuso Error: " + t.getMessage());
            }

        });
    }

    public void initFeaturedSlider(final ArrayList<Video> videoItem) {

        layout_dots = view.findViewById(R.id.layout_dots);
        viewPager = view.findViewById(R.id.pager);
        adapterImageSlider = new AdapterImageSlider(getActivity(), new ArrayList<Video>(), context);

        adapterImageSlider.setItems(videoItem);
        viewPager.setAdapter(adapterImageSlider);

        // displaying selected image first
        viewPager.setCurrentItem(0);
        addBottomDots(layout_dots, adapterImageSlider.getCount(), 0);
        ((TextView) view.findViewById(R.id.title)).setText(videoItem.get(0).getTitle());
        ((TextView) view.findViewById(R.id.brief)).setText(videoItem.get(0).getDate());
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int pos, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int pos) {
                ((TextView) view.findViewById(R.id.title)).setText(videoItem.get(pos).getTitle());
                ((TextView) view.findViewById(R.id.brief)).setText(videoItem.get(pos).getDate());
                addBottomDots(layout_dots, adapterImageSlider.getCount(), pos);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

        startAutoSlider(adapterImageSlider.getCount());
    }


    private void getFeaturedVideos() {

        FeaturedInterface apiService = APIClient.getClient().create(FeaturedInterface.class);
        Call<FeaturedResponse> call = apiService.getResults();


        call.enqueue(new Callback<FeaturedResponse>() {

            @Override
            public void onResponse(Call<FeaturedResponse> call, Response<FeaturedResponse> response) {

                if (response.isSuccessful()) {

                    try {

                        List<FeaturedAPI> videos = response.body().getData();

                        ArrayList<Video> videoItem = new ArrayList<>();

                        Log.v(TAG, "Videos Size: " + videos.size());
                        for (int i = 0; i < videos.size(); i++) {
                            videoItem.add( new Video(
                                    videos.get(i).getVid_category_title(),
                                    videos.get(i).getVid_created_at(),
                                    videos.get(i).getVid_url(),
                                    videos.get(i).getVid_category_id(),
                                    videos.get(i).getVid_start(),
                                    videos.get(i).getVid_end())
                            );
                        }

                        initFeaturedSlider(videoItem);

                    } catch (Throwable e) {
                        Log.d(TAG, "Error (Throwable): " + e.getMessage());
                        Toast.makeText(context, "Retrofit Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }


                } else {

                    if(response.code() == 401){


                    }

                    Log.d(TAG, "Retrofit Failed: " + response.message());
                }
            }

            @Override
            public void onFailure(Call<FeaturedResponse> call, Throwable t) {

                Log.d(TAG, "Kapuso Error: " + t.getMessage());
                Toast.makeText(context, "Retrofit Error: " + t.getMessage(), Toast.LENGTH_LONG).show();
            }

        });

    }

    private void addBottomDots(LinearLayout layout_dots, int size, int current) {
        ImageView[] dots = new ImageView[size];

        layout_dots.removeAllViews();
        for (int i = 0; i < dots.length; i++) {
            dots[i] = new ImageView(context);
            int width_height = 15;
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(width_height, width_height));
            params.setMargins(10, 0, 10, 0);
            dots[i].setLayoutParams(params);
            dots[i].setImageResource(R.drawable.shape_circle_outline);
            dots[i].setColorFilter(ContextCompat.getColor(context, R.color.grey_40), PorterDuff.Mode.SRC_ATOP);
            layout_dots.addView(dots[i]);
        }

        if (dots.length > 0) {
            dots[current].setImageResource(R.drawable.shape_circle);
            dots[current].setColorFilter(ContextCompat.getColor(context, R.color.grey_40), PorterDuff.Mode.SRC_ATOP);
        }
    }

    private void startAutoSlider(final int count) {
        runnable = new Runnable() {
            @Override
            public void run() {
                int pos = viewPager.getCurrentItem();
                pos = pos + 1;
                if (pos >= count) pos = 0;
                viewPager.setCurrentItem(pos);
                handler.postDelayed(runnable, 5000);
            }
        };
        handler.postDelayed(runnable, 5000);
    }

    private static class AdapterImageSlider extends PagerAdapter {

        private Activity act;
        private List<Video> items;
        private  Context context;

        private AdapterImageSlider.OnItemClickListener onItemClickListener;

        private interface OnItemClickListener {
            void onItemClick(View view, Video obj);
        }

        public void setOnItemClickListener(AdapterImageSlider.OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }

        // constructor
        private AdapterImageSlider(Activity activity, List<Video> items, Context context) {
            this.act = activity;
            this.items = items;
            this.context = context;
        }

        @Override
        public int getCount() {
            return this.items.size();
        }

        public Video getItem(int pos) {
            return items.get(pos);
        }

        public void setItems(List<Video> items) {
            this.items = items;
            notifyDataSetChanged();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            final Video o = items.get(position);
            LayoutInflater inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = inflater.inflate(R.layout.item_slider_image, container, false);

            TextView featured_title = v.findViewById(R.id.featured_title);
            RelativeLayout featured_wrapper = v.findViewById(R.id.featured_wrapper);
            MaterialRippleLayout lyt_parent = v.findViewById(R.id.lyt_parent);
            //Tools.displayImageOriginal(act, image, o.image);
            lyt_parent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(v, o);
                    }
                }
            });

            featured_title.setText(items.get(position).getTitle());

            featured_wrapper.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    String VIDEO_URL = items.get(position).getUrl();
                    int VIDEO_CATEGORY_ID = items.get(position).getCategory_id();
                    String VIDEO_TITLE = items.get(position).getTitle();
                    int VIDEO_START = items.get(position).getStart();
                    int VIDEO_END = items.get(position).getEnd();
                    String VIDEO_DATE = items.get(position).getDate();
                    String videoType = VIDEO_URL.substring(VIDEO_URL.length() - 4);
                    final String part = (VIDEO_START == 0) ? " - Full" : " - Part " + VIDEO_START + " of " + VIDEO_END;

                    if(videoType.equals(".mp4")) {
                        Intent dailyIntent = new Intent(view.getContext(), WatchMp4Activity.class);
                        dailyIntent.putExtra("url", VIDEO_URL);
                        dailyIntent.putExtra("category_id", VIDEO_CATEGORY_ID);
                        dailyIntent.putExtra("title", VIDEO_TITLE);
                        dailyIntent.putExtra("part", part);
                        dailyIntent.putExtra("date", VIDEO_DATE);
                        context.startActivity(dailyIntent);

                    } else {
                        Intent mp4Intent = new Intent(context, WatchDailymotionActivity.class);
                        mp4Intent.putExtra("url", VIDEO_URL);
                        mp4Intent.putExtra("category_id", VIDEO_CATEGORY_ID);
                        mp4Intent.putExtra("title", VIDEO_TITLE);
                        mp4Intent.putExtra("part", part);
                        mp4Intent.putExtra("date", VIDEO_DATE);
                        context.startActivity(mp4Intent);
                    }
                }
            });

            container.addView(v);

            return v;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((RelativeLayout) object);

        }

    }

    public void onRefresh() {
        initialization();
        initScrollListener();
        getFeaturedVideos();
    }

}