您的位置:首页 > 其它

为RecyclerView打造万能适配器

2016-04-05 19:45 323 查看
为了方便开发,减少代码量,打造万能的RecyclerView的适配器。

1、重写RecyclerView.Adapter<BaseViewHolder>,继承

package com.partjob.commonjar.base;

import java.util.List;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.partjob.commonjar.R;

public abstract class BaseRecyclerAdapter<T> extends
RecyclerView.Adapter<BaseViewHolder> {

protected Context context;
protected List<T> mDatas;

protected static final int TYPE_ITEM = 0;   //普通的item
protected static final int TYPE_HEADER = 1;  //第一条item,
protected static final int TYPE_FOOTER = 2;
private boolean mEnablePullLoad = false;  //添加尾
private boolean isShowHeader = false;  //添加头

public BaseRecyclerAdapter(Context context, List<T> mList) {
super();
this.context = context;
this.mDatas = mList;
}

public void setPullLoadEnable(boolean enable) {
mEnablePullLoad = enable;
}

public void setShowHeader(boolean enable) {
isShowHeader = enable;
}

/**
* TODO<添加数据,指定其位置>
*/

public void addData(T info, int position) {
mDatas.add(position, info);
notifyItemInserted(position);

}

/**
* TODO<添加数据到最后面添加>
*/

public void addData(T info) {
mDatas.add(info);
notifyDataSetChanged();
}

/**
* TODO<删除数据,指定其位置>
*/
public void deleteData(int position) {
mDatas.remove(position);
notifyItemRemoved(position);

}

/**
* TODO<某一位置开始,有itemCount个Item的数据删除>
*/
public void deleteDataAll(int positionStart, int itemCount) {
for (int i = positionStart; i < itemCount; i++) {
mDatas.remove(positionStart);
}
notifyItemRangeRemoved(positionStart, itemCount);
}

@Override
public int getItemCount() {
int size = mDatas.size();
if (mEnablePullLoad) {
size++;
}
if (isShowHeader) {
size++;
}
return size;
}

@Override
public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
int mItemLayoutId = 0;

switch (viewType) {
case 0:
mItemLayoutId = onCreateView();
break;
case 1:
mItemLayoutId = onCreateHeaderView();
break;
case 2:
mItemLayoutId = onCreateFootView();
break;
}
View view = View.inflate(viewGroup.getContext(),
mItemLayoutId, null);
// 创建一个ViewHolder
BaseViewHolder holder = new BaseViewHolder(view, viewType);
return holder;
}

/**
* item的布局文件
*/
public abstract int onCreateView();

/**
* 第一条item的布局文件,如果setShowHeader为true的话,才会调用这里,下拉刷新或则有焦点图的使用
*/
public int onCreateHeaderView() {
return 0;
}

/**
* 最后一条item的布局文件,如果setPullLoadEnable为true的话,才会调用这里,上垃加载更多等使用
*/
public int onCreateFootView() {
return 0;
}

@Override
public void onBindViewHolder(BaseViewHolder viewHolder,
int position) {
if (isShowHeader) {
position--;
}
if (viewHolder.getViewType() == 1) {
convertHeader(viewHolder, position);
} else if (viewHolder.getViewType() == 2) {
if (mDatas == null || mDatas.size() == 0) {
viewHolder.getConvertView().setVisibility(View.GONE);
} else {
viewHolder.getConvertView().setVisibility(View.VISIBLE);
}
convertFoot(viewHolder, position);
} else if (viewHolder.getViewType() == 0) {
if(onItemClickListener!=null){
final int finalPosition = position;
viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(finalPosition);
}
});

}
convert(viewHolder, mDatas.get(position), position);
}
}

/**
* 把onBindViewHolder的内容放在这个方法写就可以了
*/
public abstract void convert(BaseViewHolder helper,
T item, int position);

/**
* 头部自定义处理的适配器,头部的onBindViewHolder写在这里
*/
public void convertHeader(BaseViewHolder helper, int position) {

}

/**
* 底部自定义处理的适配器,底部的onBindViewHolder写在这里
*/
public void convertFoot(BaseViewHolder helper, int position) {

}

@Override
public int getItemViewType(int position) {
// 最后一个item设置为footerView
if (position + 1 == getItemCount() && mEnablePullLoad) {
return TYPE_FOOTER;
}
if (position == 0 && isShowHeader) {
return TYPE_HEADER;
}
return TYPE_ITEM;
}

//RecyclerView没有Item点击标签,为RecyclerView打造点击事件
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
public interface  OnItemClickListener{
void onItemClick(int position);
}

}


2、重写RecyclerView.ViewHolder

package com.partjob.commonjar.base;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;

public class BaseViewHolder extends RecyclerView.ViewHolder {
private final SparseArray<View> mViews;
private View mConvertView;
private int viewType = 0;

public BaseViewHolder(View itemView) {
this(itemView, 0);
}
public BaseViewHolder(View itemView,int viewType) {
super(itemView);
this.viewType = viewType;
this.mConvertView = itemView;
this.mViews = new SparseArray<>();
}

public View getConvertView() {
return mConvertView;
}

/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*
* @param viewId
* @return
*/
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}

/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public RecyclerView.ViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}

public int getViewType() {
return viewType;
}

public void setViewType(int viewType) {
this.viewType = viewType;

3、只需要这两个类就可以了,下面我们看看使用,大家模仿着这样写就可以了,RecyclerView直接使用这个适配器继就可以了<pre name="code" class="java">/**
* 新闻列表页的适配器
*/
public class PhotoAdapter extends BaseRecyclerAdapter<PhotoDataContext> {
private StyleUtils mStyleUtils = StyleUtils.getColorsUtils();
private XBitmapUtils mXBitmapUtils1, mXBitmapUtils2, mXBitmapUtils3, mXBitmapUtils4;

public PhotoAdapter(BaseActivity activity, List<PhotoDataContext> data) {
super(activity, data);
mXBitmapUtils1 = new XBitmapUtils(activity, R.drawable.photo_bighor, R.drawable.photo_bighor);
mXBitmapUtils2 = new XBitmapUtils(activity, R.drawable.photo_ver, R.drawable.photo_ver);
mXBitmapUtils3 = new XBitmapUtils(activity, R.drawable.photo_pethor, R.drawable.photo_pethor);
}

@Override
public int onCreateView() {
return R.layout.adapter_photo;
}

@Override
public void convert(BaseViewHolder helper, PhotoDataContext item, int position) {
ImageView photoBigImg = helper.getView(R.id.photo_big_img);
ImageView photoVerImg1 = helper.getView(R.id.photo_ver_img1);
ImageView photoVerImg2 = helper.getView(R.id.photo_ver_img2);
ImageView photoPetImg1 = helper.getView(R.id.photo_pet_img1);
ImageView photoPetImg2 = helper.getView(R.id.photo_pet_img2);
ImageView photoPetImg3 = helper.getView(R.id.photo_pet_img3);
ImageView photoPetImg4 = helper.getView(R.id.photo_pet_img4);
ImageView photoPetImg5 = helper.getView(R.id.photo_pet_img5);
ImageView photoPetImg6 = helper.getView(R.id.photo_pet_img6);
TextView photoTitle = helper.getView(R.id.photo_title);
TextView photoNum = helper.getView(R.id.photo_num);
TextView photoTime = helper.getView(R.id.photo_time);
View photoLine = helper.getView(R.id.photo_line);
photoTitle.setText(item.getTitle());
int num = item.getChildCount() - 1;
photoNum.setText(String.valueOf(num));
photoTime.setText(DateUtils.getTime(item.getTime()));
}

@Override
public int onCreateHeaderView() {
return R.layout.viewpage_news_top;
}

@Override
public int onCreateFootView() {
return R.layout.view_footer_loading;
}

public void convertFoot(BaseViewHolder helper, int position) {
TextView footerItemText = helper.getView(R.id.footer_item_text);  //下拉框的字体颜色
footerItemText.setTextColor(mStyleUtils.getBlackWordColor());
}

}


自己刚写博客,表达能力有限,请多多支持



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: