package com.jdroid.android.recycler;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.jdroid.android.R;
import com.jdroid.android.fragment.AbstractFragment;
import com.jdroid.android.loading.FragmentLoading;
import com.jdroid.android.loading.NonBlockingLoading;
public abstract class AbstractRecyclerFragment extends AbstractFragment {
private RecyclerView recyclerView;
private RecyclerViewAdapter adapter;
protected ViewGroup emptyViewContainer;
private RecyclerView.AdapterDataObserver adapterDataObserver;
private RecyclerView.LayoutManager layoutManager;
@Override
public Integer getContentFragmentLayout() {
return R.layout.jdroid_recycler_vertical_fragment;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = findView(R.id.recyclerView);
recyclerView.setHasFixedSize(hasRecyclerViewFixedSize());
layoutManager = createLayoutManager();
recyclerView.setLayoutManager(layoutManager);
if (isDividerItemDecorationEnabled()) {
recyclerView.addItemDecoration(createDividerItemDecoration());
}
emptyViewContainer = findView(R.id.emptyViewContainer);
if (adapterDataObserver == null) {
adapterDataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
refreshEmptyView();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
refreshEmptyView();
}
};
}
if (adapter != null) {
setAdapter(adapter);
}
}
protected RecyclerView.ItemDecoration createDividerItemDecoration(){
return new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST);
}
protected Boolean isDividerItemDecorationEnabled() {
return false;
}
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
protected Boolean hasRecyclerViewFixedSize() {
return true;
}
@NonNull
protected RecyclerView.LayoutManager createLayoutManager() {
return new LinearLayoutManager(getActivity());
}
public void setAdapter(RecyclerViewAdapter adapter) {
this.adapter = adapter;
adapter.registerAdapterDataObserver(adapterDataObserver);
recyclerView.setAdapter(adapter);
refreshEmptyView();
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (adapter != null && adapterDataObserver != null) {
adapter.unregisterAdapterDataObserver(adapterDataObserver);
}
}
private void refreshEmptyView() {
if (emptyViewContainer != null) {
int emptyViewContainerVisibility;
if (adapter.getItemCount() == 0) {
emptyViewContainerVisibility = View.VISIBLE;
if (emptyViewContainer.getChildCount() == 0) {
View emptyView = createEmptyView();
if (emptyView != null) {
emptyViewContainer.addView(emptyView);
} else {
emptyViewContainerVisibility = View.GONE;
}
}
} else {
emptyViewContainerVisibility = View.GONE;
}
emptyViewContainer.setVisibility(emptyViewContainerVisibility);
}
}
protected View createEmptyView() {
TextView emptyTextView = (TextView)inflate(R.layout.jdroid_empty_view);
emptyTextView.setText(getNoResultsResId());
return emptyTextView;
}
protected int getNoResultsResId() {
return R.string.jdroid_noResults;
}
public RecyclerViewAdapter getAdapter() {
return adapter;
}
public RecyclerView getRecyclerView() {
return recyclerView;
}
public RecyclerView.LayoutManager getLayoutManager() {
return layoutManager;
}
@Override
public FragmentLoading getDefaultLoading() {
return new NonBlockingLoading();
}
}