現(xiàn)在基本使用RecyclerView來代替ListView了,但是他的item點擊事件和上拉加載都需要自己來實現(xiàn)晴及。下拉刷新可以使用SwipeRefreshLayout包裹RecyclerView來實現(xiàn)都办,很簡單就不在說了。
直接貼代碼了吧虑稼。詳細(xì)東西都在注釋里面了
注意:
1.如果你的item是多種布局的琳钉,記得在activity中調(diào)用adapter的setIsShowFootView(true);否則會報錯蛛倦,或者多布局不顯示歌懒。
2.如果是單一布局的item,在adapter中g(shù)etDisplayType方法空實現(xiàn)就行溯壶。setIsShowFootView(true)同樣不應(yīng)該調(diào)用及皂。
3.默認(rèn)在不加載更多時,footview是不在顯示的且改,如果你想在沒有更多時也顯示一個footview需要調(diào)用setIsAlwaysShowFootView(true);
/**
* Created by LiJZ on 2016/5/16.
* 當(dāng)isLoadMore為true時验烧,即下拉加載更多生效時,肯定有footview
* 當(dāng)設(shè)置了下拉加載更多的事件后又跛,也可以設(shè)置sLoadMore為false碍拆,加載事件不生效。
* <p>
* 注意:當(dāng)加載的itemview不適應(yīng)屏幕時慨蓝,設(shè)置:
* RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
* mFragmentView.setLayoutParams(params);
*/
public abstract class BaseRVAdapter06<T> extends RecyclerView.Adapter {
//每次的數(shù)據(jù)不同感混,需要重寫定義
protected List<T> mListData;
protected Context mContext;
//item的布局view使用LayoutInflater加載
protected final LayoutInflater mLayoutInflater;
//item點擊事件的接口
private OnRVItemClickListener mRVItemClickListener;
//item是否有點擊事件,默認(rèn)為false
private boolean isItemClick = false;
//是否使用自定義的footview礼烈,標(biāo)志位
protected boolean isCustomFootView = false;
//是否加載更多弧满,默認(rèn)為false不加載
private boolean isLoadMore = false;
//顯示footview的標(biāo)志位
private boolean isShowFootView = false;
//footview的type
protected int FOOT_TYPE = 0430;
private OnLoadMoreListener mLoadMoreListener;
public BaseRVAdapter06(List<T> mListData, Context context) {
this.mContext = context;
this.mListData = mListData;
mLayoutInflater = LayoutInflater.from(context);
}
public BaseRVAdapter06(Context context) {
this.mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
/**
* 設(shè)置數(shù)據(jù)
*
* @param listData
*/
public void setListData(List<T> listData) {
this.mListData = listData;
notifyDataSetChanged();
}
/**
* 獲取數(shù)據(jù)
*
* @return
*/
public List<T> getListData() {
return mListData;
}
/**
* 顯示footview,默認(rèn)跟隨loadmore此熬,當(dāng)loadmore為true是顯示footview否則不顯示
* 當(dāng)設(shè)為true時谱秽,都會顯示一個footview
*/
public void setIsShowFootView(boolean isShowFootView) {
this.isShowFootView = isShowFootView;
}
/**
* 設(shè)置是否底部顯示加載更多洽蛀,默認(rèn)不顯示
*
* @param isLoadMore
*/
public void setIsLoadMore(boolean isLoadMore) {
this.isLoadMore = isLoadMore;
}
@Override
public int getItemCount() {
if ((isShowFootView || isLoadMore))
return mListData == null ? 0 : mListData.size() + 1;
return mListData == null ? 0 : mListData.size();
}
@Override
public int getItemViewType(int position) {
if ((isShowFootView || isLoadMore) && position == getItemCount() - 1) {
return FOOT_TYPE;
}
if (getDisplayType(position) > 0) {
return getDisplayType(position);
}
return super.getItemViewType(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if ((isShowFootView || isLoadMore) && viewType == FOOT_TYPE) {
if (onCreateFootHolder(parent, viewType) != null) {
isCustomFootView = true;
return onCreateFootHolder(parent, viewType);
} else {
//默認(rèn)情況的footview,可以修改
View view = mLayoutInflater.inflate(R.layout.item_footview, null);
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(params);
return new FootHolder(view);
}
}
return onCreateDisplayHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//當(dāng)是最底部加載更多的view時
if ((isShowFootView || isLoadMore) && position == getItemCount() - 1) {
if (!isCustomFootView) {//使用默認(rèn)的footview
FootHolder footHolder = (FootHolder) holder;
if (isLoadMore) {
footHolder.mllLoadMore.setVisibility(View.VISIBLE);
footHolder.mtvNoMore.setVisibility(View.GONE);
if (mLoadMoreListener != null) {
// TODO: 2016/11/29 正式應(yīng)用時修改
// handler.sendEmptyMessage(0);
handler.sendEmptyMessageDelayed(0, 500);
}
} else {
footHolder.mllLoadMore.setVisibility(View.GONE);
footHolder.mtvNoMore.setVisibility(View.VISIBLE);
}
} else {//使用自定義footview
if (isLoadMore) {
onFootViewLoading(holder, position);
if (mLoadMoreListener != null) {
// TODO: 2016/11/29 正式應(yīng)用時修改
// handler.sendEmptyMessage(0);
handler.sendEmptyMessageDelayed(0, 500);
}
} else {
onFootViewLoadFinish(holder, position);
}
}
return;
}
//給recyclerview的item設(shè)置點擊事件
if (isItemClick) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mRVItemClickListener != null) {
mRVItemClickListener.setItemClickListener(v, position);
}
}
});
}
onBindItemViewHolder(holder, position);
}
/**
* 給item的viewholder綁定數(shù)據(jù)
*
* @param holder
* @param position
*/
public abstract void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position);
/**
* 如果你的item布局是多種疟赊,需要復(fù)寫這個方法
*
* @param postion
* @return
*/
public abstract int getDisplayType(int postion);
/**
* 創(chuàng)建item的viewholder
*
* @param parent
* @param viewType
* @return
*/
public abstract RecyclerView.ViewHolder onCreateDisplayHolder(ViewGroup parent, int viewType);
/**
* 設(shè)置自定義FootView,如果返回為空則使用默認(rèn)布局,如需設(shè)置自定義FootView需重寫此方法
*
* @param parent
* @param viewType
* @return
*/
public RecyclerView.ViewHolder onCreateFootHolder(ViewGroup parent, int viewType) {
return null;
}
/**
* 正在加載時footview的設(shè)置峡碉,默認(rèn)無操作近哟,需要時重寫此方法
*
* @param holder
* @param position
*/
public void onFootViewLoading(RecyclerView.ViewHolder holder, int position) {
}
/**
* 加載更多完成時的footview的設(shè)置,默認(rèn)無操作鲫寄,需要時重寫此方法
*
* @param holder
* @param position
*/
public void onFootViewLoadFinish(RecyclerView.ViewHolder holder, int position) {
}
/**
* footview的viewholder
*/
class FootHolder extends RecyclerView.ViewHolder {
private TextView mtvNoMore;
private LinearLayout mllLoadMore;
public FootHolder(View itemView) {
super(itemView);
mtvNoMore = (TextView) itemView.findViewById(R.id.tv_no_more);
mllLoadMore = (LinearLayout) itemView.findViewById(R.id.ll_load_more);
}
}
/**
* 定義一個接口吉执,處理recyclerview的item的點擊事件(整個item的點擊事件,item的某一項的點擊事件地来,
* 需要在ViewHolder或者onBindItemViewHolder中具體設(shè)置)
*/
public interface OnRVItemClickListener {
/**
* @param v 該條目的view對象
* @param position 該位置對應(yīng)的position
*/
void setItemClickListener(View v, int position);
}
/**
* 加載更多的接口,滑動到底部自動加載數(shù)據(jù)
*/
public interface OnLoadMoreListener {
void loadMore();
}
/**
* 設(shè)置item的點擊事件戳玫,不包含footview
*
* @param mRVItemClickListener
*/
public void setOnRVItemClickListener(OnRVItemClickListener mRVItemClickListener) {//對外暴露的接口
this.mRVItemClickListener = mRVItemClickListener;
isItemClick = true;
}
/**
* 設(shè)置加載更多的監(jiān)聽事件
*
* @param moreListerner
*/
public void setOnLoadMoreListerner(OnLoadMoreListener moreListerner) {//對外暴露的接口 設(shè)置加載更多的監(jiān)聽事件
isLoadMore = true;
this.mLoadMoreListener = moreListerner;
}
/**
* 獲取加載更多的監(jiān)聽事件
*
* @return
*/
public OnLoadMoreListener getMoreListerner() {//對外暴露的接口 獲取加載更多的監(jiān)聽事件
return mLoadMoreListener;
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mLoadMoreListener != null) {
mLoadMoreListener.loadMore();
}
}
};
public void addData(int position, T t) {
if (mListData != null) {
mListData.add(t);
notifyItemInserted(position);
}
}
}