package cn.sinata.xldutils.fragment; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; import cn.sinata.xldutils.R; import cn.sinata.xldutils.adapter.HFRecyclerAdapter; import cn.sinata.xldutils.utils.DensityUtil; import cn.sinata.xldutils.view.SwipeRefreshRecyclerLayout; /** * */ public abstract class RecyclerViewFragment extends BaseFragment { protected SwipeRefreshRecyclerLayout mSwipeRefreshLayout; private RecyclerView.ItemDecoration defaultItemDecoration; private TextView emptyView; protected int DEFAULT_MARGIN_DIVIDER = 0; protected int DEFAULT_DIVIDER = 1; protected RecyclerView recyclerView; protected abstract RecyclerView.Adapter setAdapter(); /** * 下拉刷新 */ protected void pullDownRefresh() { } /** * 加载更多 */ protected void loadMore() { } /** * @return 默认上拉下拉同时存在 */ protected SwipeRefreshRecyclerLayout.Mode getMode() { return SwipeRefreshRecyclerLayout.Mode.Both; } /** * @return 默认垂直布局。 */ protected RecyclerView.LayoutManager getLayoutManager() { return new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); } @Override protected final int getContentViewLayoutID() { return R.layout.fragment_vertical_linear_recyclerview; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mSwipeRefreshLayout = mHolder.bind(R.id.mSwipeRefreshLayout); recyclerView = mHolder.bind(R.id.mRecyclerView); emptyView = mHolder.bind(R.id.emptyView); emptyView.setVisibility(View.GONE); emptyView.setTextColor(getLoadMoreTextColor()); defaultItemDecoration = new HorizontalDividerItemDecoration.Builder(context) .colorResId(R.color.dividing_line_color) .marginResId(R.dimen.activity_horizontal_margin, R.dimen.activity_horizontal_margin) .size(1) .build(); //默认分割线 setItemDecoration(DEFAULT_DIVIDER); mSwipeRefreshLayout.setLayoutManager(getLayoutManager()); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshRecyclerLayout.OnRefreshListener() { @Override public void onRefresh() { pullDownRefresh(); } @Override public void onLoadMore() { loadMore(); } }); mSwipeRefreshLayout.setMode(getMode()); if (setAdapter() != null) { final RecyclerView.Adapter adapter = setAdapter(); mSwipeRefreshLayout.setAdapter(adapter); dataObserver = new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); RecyclerView.Adapter a = mSwipeRefreshLayout.getRecyclerView().getAdapter(); if (a == null) { return; } int size = a.getItemCount(); if (a instanceof HFRecyclerAdapter) { size = ((HFRecyclerAdapter) a).getDataItemCount(); } if (size <= 0) { if (useDefaultEmptyView()) { emptyView.setVisibility(View.VISIBLE); mSwipeRefreshLayout.setVisibility(View.GONE); } else { emptyView.setVisibility(View.GONE); mSwipeRefreshLayout.setVisibility(View.VISIBLE); } } else { emptyView.setVisibility(View.GONE); mSwipeRefreshLayout.setVisibility(View.VISIBLE); } } }; adapter.registerAdapterDataObserver(dataObserver); emptyView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showDialog(); pullDownRefresh(); } }); } } RecyclerView.AdapterDataObserver dataObserver; @Override public void onDestroyView() { try { RecyclerView.Adapter adapter = getRecyclerView().getAdapter(); if (dataObserver != null && adapter != null) { adapter.unregisterAdapterDataObserver(dataObserver); } } catch (Exception e) { e.printStackTrace(); } super.onDestroyView(); } protected void setEmptyViewText(CharSequence cs) { emptyView.setText(cs); } protected void setEmptyViewClick(View.OnClickListener listener) { emptyView.setOnClickListener(listener); } /** * 设置刷新状态 * * @param refreshing 刷新状态 */ public void setRefreshing(boolean refreshing) { mSwipeRefreshLayout.setRefreshing(refreshing); } /** * 刷新完成 */ public void onRefreshCompleted() { mSwipeRefreshLayout.setRefreshing(false); } protected void setLoadMoreText(CharSequence text) { mSwipeRefreshLayout.setLoadMoreText(text); } /** * 设置分割线,只能设置1种分割线 * * @param itemDecoration 样式 */ protected void setItemDecoration(RecyclerView.ItemDecoration itemDecoration) { if (itemDecoration == null) { try { mSwipeRefreshLayout.getRecyclerView().removeItemDecoration(defaultItemDecoration); } catch (Exception e) { e.printStackTrace(); } return; } if (defaultItemDecoration != null) { mSwipeRefreshLayout.getRecyclerView().removeItemDecoration(defaultItemDecoration); } defaultItemDecoration = itemDecoration; mSwipeRefreshLayout.addItemDecoration(defaultItemDecoration); } /** * 添加分割线,可以是多种。比如网格的横竖2中分割线,不会覆盖。 * * @param itemDecoration 分割线 */ protected void addItemDecoration(RecyclerView.ItemDecoration itemDecoration) { if (itemDecoration == null) { return; } mSwipeRefreshLayout.addItemDecoration(itemDecoration); } protected void setItemDecoration(int type) { HorizontalDividerItemDecoration itemDecoration; if (type == DEFAULT_MARGIN_DIVIDER) { itemDecoration = new HorizontalDividerItemDecoration.Builder(context) .margin(DensityUtil.dip2px(context, 16)) .size(1) .color(ContextCompat.getColor(context, R.color.dividing_line_color)) .build(); } else { itemDecoration = new HorizontalDividerItemDecoration.Builder(context) .size(1) .color(ContextCompat.getColor(context, R.color.dividing_line_color)) .build(); } setItemDecoration(itemDecoration); } public RecyclerView getRecyclerView() { return mSwipeRefreshLayout.getRecyclerView(); } protected boolean useDefaultEmptyView() { return true; } protected int getLoadMoreTextColor() { return Color.WHITE; } }