Commit 25a593b2 by 罗翻

recyclerview封装

parent 2069dc7e
package com.dayu.bigfish.base.adapter;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
/**
* Created by luofan on 2017/12/9.
*/
public class BaseViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder {
public final T mBind;
public BaseViewHolder(T t) {
super(t.getRoot());
mBind = t;
}
}
package com.dayu.bigfish.base.adapter;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.dayu.bigfish.BR;
import com.dayu.bigfish.Constants;
import com.dayu.bigfish.R;
import com.dayu.bigfish.base.BasePageBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by luofan on 2017/12/9.
*/
@SuppressWarnings("unchecked")
public class CoreAdapter<M> extends RecyclerView.Adapter<BaseViewHolder> {
private boolean needHint = false;
private TypeSelector<M> mTypeSelector;
private List<M> mItemList = new ArrayList<>();
public boolean isHasMore = true;
private List<Item> mHeadTypeDatas = new ArrayList<>();
private List<Item> mFootTypeDatas = new ArrayList<>();
private int viewType;
private int mFooterViewType = R.layout.recycler_foot;
protected Context mContext;
private int mTotalPage;
private int mPage = 1;
public boolean isLoadFial = false;
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
this.mContext = parent.getContext();
return new BaseViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), viewType, parent, false));
}
public CoreAdapter() {
mFootTypeDatas.add(new Item(mFooterViewType, true));
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
Object item = getItem(position);
if (needHint && holder.itemView.getTag() == null) {
holder.itemView.setTag(item);
holder.itemView.postDelayed(() -> {
holder.mBind.setVariable(BR.item, holder.itemView.getTag());
holder.mBind.executePendingBindings();
if (!(item instanceof Boolean)) {
onBind(holder, position, (M) item);
}
}, 100);
} else {
if (needHint) {
holder.itemView.setTag(item);
}
holder.mBind.setVariable(BR.item, item);
holder.mBind.executePendingBindings();
if (item != null && !(item instanceof Boolean)) {
onBind(holder, position, (M) item);
}
}
}
public void setViewType(@LayoutRes int type) {
this.viewType = type;
}
public void setTypeSelector(TypeSelector mTypeSelector) {
this.mTypeSelector = mTypeSelector;
this.viewType = Constants.FLAG_MULTI_VH;
}
public void addHeadViewType(@LayoutRes int i, Object data) {
mHeadTypeDatas.add(new Item(i, data));
}
public void addFooterViewType(@LayoutRes int i, Object data) {
mFootTypeDatas.add(mFootTypeDatas.size() - 1, new Item(i, data));
}
public Object getItem(int position) {
if (position < mHeadTypeDatas.size()) {
return mHeadTypeDatas.get(position).data;
} else if (position >= (mHeadTypeDatas.size() + mItemList.size())) {
int index = position - (mHeadTypeDatas.size() + mItemList.size());
if (mFootTypeDatas.get(index).type == mFooterViewType && !isHasMore) {
if (isLoadFial) {
return null;
} else {
return false;
}
} else {
if (isLoadFial) {
return null;
} else {
return mFootTypeDatas.get(index).data;
}
}
} else {
return mItemList.get(position - mHeadTypeDatas.size());
}
}
@Override
public int getItemViewType(int position) {
if (position < mHeadTypeDatas.size()) {
return mHeadTypeDatas.get(position).type;
} else if (position >= (mHeadTypeDatas.size() + mItemList.size())) {
return mFootTypeDatas.get(position - (mHeadTypeDatas.size() + mItemList.size())).type;
} else {
return viewType == Constants.FLAG_MULTI_VH ?
mTypeSelector.getType((M) getItem(position)) :
viewType;
}
}
public void addData(BasePageBean<M> data) {
if (data == null) {
isHasMore = false;
notifyDataSetChanged();
return;
}
mPage += 1;
mTotalPage = data.getTotalPages();
if (mPage >= mTotalPage) {
isHasMore = false;
} else {
isHasMore = true;
}
this.mItemList.addAll(data.getData());
notifyDataSetChanged();
}
public void setNewData(BasePageBean<M> data) {
mPage = 1;
mTotalPage = data.getTotalPages();
if (mPage >= mTotalPage) {
isHasMore = false;
} else {
isHasMore = true;
}
this.mItemList = data.getData();
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mItemList.size() + mHeadTypeDatas.size() + mFootTypeDatas.size();
}
public class Item {
int type;
Object data;
public Item(int type, Object data) {
this.type = type;
this.data = data;
}
}
protected void onBind(BaseViewHolder holder, int position, M item) {
}
}
\ No newline at end of file
package com.dayu.bigfish.base.adapter;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.dayu.bigfish.R;
import com.dayu.bigfish.base.BasePageBean;
import com.dayu.bigfish.ui.listener.OnRefreshListener;
import com.dayu.bigfish.ui.listener.onLoadMoreListener;
/**
* Created by luofan on 2017/12/9.
*/
public class LRecyclerView<M> extends FrameLayout {
private boolean isHasHeadView = false, isHasFootView = false, isEmpty = false, isReverse = false, needHint = false, needCoreAdapter = false;
private int headType, footType;
private SwipeRefreshLayout swipeRefresh;
private RecyclerView recyclerview;
private LinearLayout ll_emptyView;
private OnRefreshListener mRefreshListener;
private onLoadMoreListener mLoadMoreListener;
private LinearLayoutManager mLayoutManager;
public CoreAdapter<M> mCommAdapter;
private int itemType;
private boolean isRefresh = true;
public LRecyclerView(@NonNull Context context) {
super(context);
init(context, null);
}
public LRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public LRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
//初始化参数
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.TRecyclerView);
headType = ta.getResourceId(R.styleable.TRecyclerView_headType, 0);
itemType = ta.getResourceId(R.styleable.TRecyclerView_itemType, 0);
footType = ta.getResourceId(R.styleable.TRecyclerView_footType, 0);
isReverse = ta.getBoolean(R.styleable.TRecyclerView_isReverse, false);
needCoreAdapter = ta.getBoolean(R.styleable.TRecyclerView_needCoreAdapter, false);
if (!needHint) needHint = ta.getBoolean(R.styleable.TRecyclerView_needHint, false);
boolean isRefreshable = ta.getBoolean(R.styleable.TRecyclerView_isRefreshable, true);
ta.recycle();
//初始化recycleview
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);
swipeRefresh.setColorSchemeResources(android.R.color.holo_blue_bright);
mLayoutManager = new LinearLayoutManager(context);
recyclerview.setLayoutManager(mLayoutManager);
recyclerview.setItemAnimator(new DefaultItemAnimator());
swipeRefresh.setEnabled(isRefreshable);
if (needCoreAdapter) {
if (itemType != 0) {
mCommAdapter = new CoreAdapter<>();
setViewType(itemType);
recyclerview.setAdapter(mCommAdapter);
}
}
if (isReverse) {
mLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示
mLayoutManager.setReverseLayout(true);//列表翻转
recyclerview.setLayoutManager(mLayoutManager);
}
swipeRefresh.setOnRefreshListener(() -> {
Refresh();
});
ll_emptyView.setOnClickListener((view -> {
isEmpty = false;
ll_emptyView.setVisibility(View.GONE);
swipeRefresh.setVisibility(View.VISIBLE);
Refresh();
}));
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) {
if (mLoadMoreListener != null) {
mCommAdapter.isLoadFial = false;
mCommAdapter.notifyDataSetChanged();
isRefresh = false;
mLoadMoreListener.onLoadMore();
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int arg0, int arg1) {
super.onScrolled(recyclerView, arg0, arg1);
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
}
});
}
public void setAdapter(CoreAdapter<M> adapter) {
mCommAdapter = adapter;
if (itemType != 0) {
setViewType(itemType);
}
recyclerview.setAdapter(mCommAdapter);
}
public LRecyclerView setFootData(Object data) {
isHasFootView = footType != 0;
this.mCommAdapter.addFooterViewType(footType, data);
return this;
}
public LRecyclerView setHeadData(Object data) {
isHasHeadView = headType != 0;
this.mCommAdapter.addHeadViewType(headType, data);
return this;
}
public void setEmpty() {
if ((!isHasHeadView || isReverse && !isHasFootView) && !isEmpty) {
isEmpty = true;
ll_emptyView.setVisibility(View.VISIBLE);
swipeRefresh.setVisibility(View.GONE);
}
}
public void reSetEmpty() {
if (isEmpty) {
ll_emptyView.setVisibility(View.GONE);
swipeRefresh.setVisibility(View.VISIBLE);
}
}
public void setNewData(BasePageBean<M> data) {
if (isRefresh) {
if (data == null) {
setEmpty();
return;
}
mCommAdapter.isLoadFial = false;
reSetEmpty();
swipeRefresh.setRefreshing(false);
if (data != null && data.getData().size() == 0) {
setEmpty();
} else if (isReverse) {
recyclerview.scrollToPosition(mCommAdapter.getItemCount() - data.getData().size() - 2);
}
mCommAdapter.setNewData(data);
} else {
mCommAdapter.isLoadFial = false;
swipeRefresh.setRefreshing(false);
mCommAdapter.addData(data);
}
}
public void setDataFail() {
if (isRefresh) {
setEmpty();
} else {
mCommAdapter.isLoadFial = true;
mCommAdapter.notifyDataSetChanged();
}
}
public void Refresh() {
if (mRefreshListener != null) {
isRefresh = true;
mRefreshListener.refresh();
}
}
public void setViewType(@LayoutRes int type) {
mCommAdapter.setViewType(type);
}
public void setRefreshListener(OnRefreshListener listener) {
mRefreshListener = listener;
}
public void setOnLoadMoreListener(onLoadMoreListener listener) {
mLoadMoreListener = listener;
}
}
package com.dayu.bigfish.base.adapter;
/**
* Created by luofan on 2017/12/9.
*/
public interface TypeSelector<M> {
int getType(M m);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment