package com.gh4a.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.NestedScrollView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.gh4a.R; import com.gh4a.adapter.RootAdapter; import com.gh4a.loader.LoaderCallbacks; import com.gh4a.utils.UiUtils; import com.gh4a.widget.DividerItemDecoration; import com.gh4a.widget.SwipeRefreshLayout; import com.pluscubed.recyclerfastscroll.RecyclerFastScroller; public abstract class LoadingListFragmentBase extends LoadingFragmentBase implements LoaderCallbacks.ParentCallback, SwipeRefreshLayout.ChildScrollDelegate { private RecyclerView mRecyclerView; private LinearLayoutManager mLayoutManager; private NestedScrollView mEmptyViewContainer; private RecyclerFastScroller mFastScroller; public interface OnRecyclerViewCreatedListener { void onRecyclerViewCreated(Fragment fragment, RecyclerView recyclerView); } public LoadingListFragmentBase() { } @Override protected View onCreateContentView(LayoutInflater inflater, ViewGroup parent) { View view = inflater.inflate(R.layout.list_fragment_content, parent, false); mEmptyViewContainer = (NestedScrollView) view.findViewById(R.id.empty_view_container); TextView emptyView = (TextView) view.findViewById(android.R.id.empty); int emptyTextResId = getEmptyTextResId(); if (emptyTextResId != 0) { emptyView.setText(emptyTextResId); } mLayoutManager = new LinearLayoutManager(view.getContext()); mRecyclerView = (RecyclerView) view.findViewById(R.id.list); mRecyclerView.setLayoutManager(mLayoutManager); onRecyclerViewInflated(mRecyclerView, inflater); if (hasDividers()) { mRecyclerView.addItemDecoration(new DividerItemDecoration(view.getContext())); } if (!hasCards()) { mRecyclerView.setBackgroundResource( UiUtils.resolveDrawable(getActivity(), R.attr.listBackground)); } mFastScroller = (RecyclerFastScroller) view.findViewById(R.id.fast_scroller); mFastScroller.attachRecyclerView(mRecyclerView); mFastScroller.setOnHandleTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: getBaseActivity().setRightDrawerLockedClosed(true); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: getBaseActivity().setRightDrawerLockedClosed(false); break; } return false; } }); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (getActivity() instanceof OnRecyclerViewCreatedListener) { ((OnRecyclerViewCreatedListener) getActivity()).onRecyclerViewCreated(this, mRecyclerView); } } @Override public boolean canChildScrollUp() { return getView() != null && UiUtils.canViewScrollUp(mRecyclerView); } protected void updateEmptyState() { if (mRecyclerView == null) { return; } boolean empty = false; RecyclerView.Adapter<?> adapter = mRecyclerView.getAdapter(); if (adapter instanceof RootAdapter) { // don't count headers and footers empty = ((RootAdapter) adapter).getCount() == 0; } else if (adapter != null) { empty = adapter.getItemCount() == 0; } mRecyclerView.setVisibility(empty ? View.GONE : View.VISIBLE); mEmptyViewContainer.setVisibility(empty ? View.VISIBLE : View.GONE); } protected void onRecyclerViewInflated(RecyclerView view, LayoutInflater inflater) { } protected void scrollToAndHighlightPosition(final int position) { mLayoutManager.scrollToPosition(position); final RecyclerView.Adapter<?> adapter = mRecyclerView.getAdapter(); if (adapter instanceof RootAdapter) { mRecyclerView.postDelayed(new Runnable() { @Override public void run() { ((RootAdapter) adapter).highlight(position); } }, 600); } } protected boolean hasDividers() { return true; } protected boolean hasCards() { return false; } @Override protected void setHighlightColors(int colorAttrId, int statusBarColorAttrId) { super.setHighlightColors(colorAttrId, statusBarColorAttrId); UiUtils.trySetListOverscrollColor(mRecyclerView, getHighlightColor()); mFastScroller.setHandlePressedColor(getHighlightColor()); } protected abstract int getEmptyTextResId(); }