首先RecyclerView是一个ViewGroup,它和我们常用的各种Layout一样,是用来装很多子View的容器,那么它里面装的那些View是怎么来的呢?其实是来自ViewHolder中的itemView的。那么ViewHolder是从哪里生成的呢?显示的数据又是在哪里设置的呢?这就是Adapter的作用,它根据要展示数据的内容和类型,生成相应的ViewHolder,并对相应的View进行设置,从而展示出来。
如果从数据源出发就是,Adapter将要展示的数据根据其内容和类型,转化成对应的ViewHolder并对其进行设置,然后RecyclerView把ViewHolder中的itemView展示出来。
我们首先对RecyclerView.ViewHolder进行封装,抽取相关属性的类
BaesRecyclerView 继承Adapter 然后在其类中写个接口获取点击事件
public abstract class BaesRecyclerView<T> extends RecyclerView.Adapter<BaseViewHoder> { public ArrayList<T> list; public BaesRecyclerView(Activity activity, ArrayList<T> list) { this.list = list; } public ArrayList<T> getDatas() { if (list == null) { list = new ArrayList<>(); } return list; } private OnItemClickLitener mOnItemClickLitener; public interface OnItemClickLitener { void onItemClick(View view, int position); } public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; } @Override public BaseViewHoder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(parent.getContext()).inflate(getItemLayoutId(), parent, false); BaseViewHoder baseViewHoder = new BaseViewHoder(inflate) { @Override protected void createViewHolder(View itemView) { createHolder(itemView); } }; return baseViewHoder; } @Override public void onBindViewHolder(final BaseViewHoder holder, int position) { // 显示数据 T data = list.get(position); showData(position, holder, data); //这里添加是为了防止数据多造成数据混乱 holder.itemview.resetUi() if (mOnItemClickLitener != null) {holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemClick(holder.itemView, pos); } }); } } /** * 获取控件 * @param itemView */ protected abstract void createHolder(View itemView); /** * 返回一个用于创建item条目的布局id */ protected abstract int getItemLayoutId(); /** * 显示数据到viewHolder中的控件中 * * @param position * @param holder * @param data */ protected abstract void showData(int position, BaseViewHoder holder, T data); @Override public int getItemCount() { return list == null ? 0 : list.size(); } }
BaseViewHoder 去继承Viewholder
public abstract class BaseViewHoder extends RecyclerView.ViewHolder{
public BaseViewHoder(View itemView) {
super(itemView);
createViewHolder(itemView);
}
protected abstract void createViewHolder(View itemView);
}
3.在Acyivity中写RecyclerView的风格形式,我这里用默认风格
//设置固定大小
mRecyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(OrientationHelper.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
NewHomeAdapter adapter = new NewHomeAdapter(seconActivity.this, mList);
mRecyclerView.setAdapter(adapter);
4.分割线 ,RecyclerView没有分割线,不过谷歌给我们了接口,让我们自己去实现,直接继承ItemDecoration,实现其的方法
class DividerItemDecoration extends RecyclerView.ItemDecoration {
public void onDrawOver(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
//以下计算主要用来确定绘制的位置
final int top = child.getBottom() + params.bottomMargin;
//绘制虚线
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
Path path = new Path();
path.moveTo(left, top);
path.lineTo(right,top);
PathEffect effects = new DashPathEffect(new float[]{0,0,0,0},0);//此处单位是像素不是dp 注意 请自行转化为dp
paint.setPathEffect(effects);
c.drawPath(path, paint);
}
}
}
最后在Activity调用其方法
mRecyclerView.addItemDecoration(new DividerItemDecoration());
2271

被折叠的 条评论
为什么被折叠?



