package com.base.adapter; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.LayoutRes; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.app.annotation.aspect.DbRealm; import com.ui.main.R; import java.util.List; public class TRecyclerView<M> extends FrameLayout implements AdapterPresenter.IAdapterView { private SwipeRefreshLayout swipeRefresh; private RecyclerView recyclerview; private LinearLayout ll_emptyView; private LinearLayoutManager mLayoutManager; public CoreAdapter<M> mCommAdapter; private AdapterPresenter<M> mCoreAdapterPresenter; private boolean isHasHeadView = false, isHasFootView = false, isEmpty = false, isReverse = false; private int headType, footType; public TRecyclerView(Context context) { super(context); init(context, null); } public TRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public TRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public AdapterPresenter getPresenter() { return mCoreAdapterPresenter; } public void init(Context context, AttributeSet attrs) { TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.TRecyclerView); headType = ta.getResourceId(R.styleable.TRecyclerView_headType, 0); int itemType = ta.getResourceId(R.styleable.TRecyclerView_itemType, 0); footType = ta.getResourceId(R.styleable.TRecyclerView_footType, 0); isReverse = ta.getBoolean(R.styleable.TRecyclerView_isReverse, false); boolean isRefreshable = ta.getBoolean(R.styleable.TRecyclerView_isRefreshable, true); ta.recycle(); View layout = inflate(context, R.layout.layout_list_recyclerview, this); swipeRefresh = (SwipeRefreshLayout) layout.findViewById(R.id.swiperefresh); recyclerview = (RecyclerView) layout.findViewById(R.id.recyclerview); ll_emptyView = (LinearLayout) layout.findViewById(R.id.ll_emptyview); mCoreAdapterPresenter = new AdapterPresenter<>(this); swipeRefresh.setColorSchemeResources(android.R.color.holo_blue_bright); swipeRefresh.setOnRefreshListener(this::reFetch); recyclerview.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(context); recyclerview.setLayoutManager(mLayoutManager); recyclerview.setItemAnimator(new DefaultItemAnimator()); mCommAdapter = new CoreAdapter<>(); recyclerview.setAdapter(mCommAdapter); recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() { int lastVisibleItem; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (recyclerview.getAdapter() != null && newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == recyclerview.getAdapter() .getItemCount() && mCommAdapter.isHasMore) mCoreAdapterPresenter.fetch(); } @Override public void onScrolled(RecyclerView recyclerView, int arg0, int arg1) { super.onScrolled(recyclerView, arg0, arg1); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); ll_emptyView.setOnClickListener((view -> { isEmpty = false; ll_emptyView.setVisibility(View.GONE); swipeRefresh.setVisibility(View.VISIBLE); reFetch(); })); if (itemType != 0) setViewType(itemType); swipeRefresh.setEnabled(isRefreshable); if (isReverse) { mLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示 mLayoutManager.setReverseLayout(true);//列表翻转 recyclerview.setLayoutManager(mLayoutManager); } } public TRecyclerView<M> setTypeSelector(TypeSelector mTypeSelector) { this.mCommAdapter.setTypeSelector(mTypeSelector); return this; } public TRecyclerView<M> setFootData(Object data) { isHasFootView = footType != 0; this.mCommAdapter.addFooterViewType(footType, data); return this; } public TRecyclerView<M> setHeadData(Object data) { isHasHeadView = headType != 0; this.mCommAdapter.addHeadViewType(headType, data); return this; } public void setViewType(@LayoutRes int type) { this.mCommAdapter.setViewType(type); } public TRecyclerView<M> setData(List<M> data) { reSetEmpty(); mCommAdapter.setBeans(data, 1); return this; } public void reFetch() { mCoreAdapterPresenter.setBegin(0); swipeRefresh.setRefreshing(true); mCoreAdapterPresenter.fetch(); } @Override public void setEmpty() { if ((!isHasHeadView || isReverse && !isHasFootView) && !isEmpty) { isEmpty = true; ll_emptyView.setVisibility(View.VISIBLE); swipeRefresh.setVisibility(View.GONE); } } @DbRealm public void setNetData(List data, int begin) { swipeRefresh.setRefreshing(false); mCommAdapter.setBeans(data, begin); if ((begin == 1) && (data == null || data.size() == 0)) setEmpty(); else if (isReverse) recyclerview.scrollToPosition(mCommAdapter.getItemCount() - data.size() - 2); } @Override public void setDBData(List data) { swipeRefresh.setRefreshing(false); mCommAdapter.setBeans(data, -1); if ((data == null || data.size() == 0)) setEmpty(); else if (isReverse) recyclerview.scrollToPosition(mCommAdapter.getItemCount() - data.size() - 2); } @Override public void reSetEmpty() { if (isEmpty) { ll_emptyView.setVisibility(View.GONE); swipeRefresh.setVisibility(View.VISIBLE); } } }