RecyclerView抽取基类,item实现点击,增加分割线

首先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());

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值