RecycleView的使用,并添加子item的点击事件

简介: 1.导入 compile ‘com.android.support:recyclerview-v7:23.3.0’2.准备工作(间隔)import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import

1.导入

compile ‘com.android.support:recyclerview-v7:23.3.0’

2.准备工作(间隔)

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

/**
 * This class is from the v7 samples of the Android SDK. It's not by me!
 * <p/>
 * See the license above for details.
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration
{

    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;



    private Drawable mDivider;

    private int mOrientation;

    public DividerItemDecoration(Context context, int orientation)
    {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation)
    {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
        {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent)
    {
        Log.v("recyclerview - itemdecoration", "onDraw()");
         if (mOrientation == VERTICAL_LIST) {
                drawVertical(c, parent);
            } else {
                drawHorizontal(c, parent);
            }
    }

    public void drawVertical(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);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(
                    parent.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawHorizontal(Canvas c, RecyclerView parent)
    {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        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 left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition,
            RecyclerView parent)
    {
        if (mOrientation == VERTICAL_LIST)
        {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else
        {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }
}


//TypedArray a = context.obtainStyledAttributes(ATTRS)
//这里是拿到一个间隔的样式
//如果想自定义可以去 Style 文件利用listDivider编辑
//<item name="android:listDivider">@drawable/diver_cr</item>
//diver_cr.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#66666666"
        android:endColor="#ff4c4c4c"
        android:centerColor="#808080"
        android:angle="45"
        android:type="linear"/>
    <size android:height="4dp"/>
</shape>

3.开始使用

  • xml 的编写
  • 简单的Adapter编写
/**
 * author Phyooos
 * date 16/5/3.
 */
public class CrAdapter  extends RecyclerView.Adapter<CrViewHodle>{

    ArrayList<String> mdata ;
    private Context mContext;
    private LayoutInflater inflater;

    //构造传参
    public CrAdapter(Context mContext ,ArrayList<String> mdata) {
        this.mdata = mdata;
        this.mContext = mContext;
        this.inflater = LayoutInflater.from(mContext);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(CrViewHodle holder, int position) {
        holder.textView.setText(mdata.get(position));
    }

    //加载iten布局并创建ViewHolder
    @Override
    public CrViewHodle onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_recycle,parent,false);
        CrViewHodle hodle = new CrViewHodle(view);
        return hodle;
    }


    //条目总数
    @Override
    public int getItemCount() {
        return mdata.size();
    }
}
//各个控件声明,初始化
class CrViewHodle  extends RecyclerView.ViewHolder {
    TextView textView;
    public CrViewHodle(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.text);
    }
}

4.在Activity中使用

        //获得CrAdapter
        crAdapter = new CrAdapter(this,mDatas);
        //设置CrAdapter
        mRecyclerView.setAdapter(crAdapter);
        //Context   VERTICAL或者HORIZONTAL的样式
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        mRecyclerView.setLayoutManager(manager);
        //设置Item动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置间隔    Context  以及mRecyclerView样式,与上面一致
            mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));

5.添加点击事件

这个大概有2种比较方便的方法来实现
但是个人比较倾向于在
onBindViewHolder中给控件带上参数来使用setOnClickListener

例子:
1.定义一个接口

/**
 * @author: phyooos on 16.6.22 09:58.
 * @E-mail: phyooos@163.com
 */
public interface OnRecycleItemListener {
    void OnRecycleItemClick(View v,Object o);
}

我发现Object o每一次都需要转化,很麻烦
也可以这样使用,

public interface OnRecycleItemListener <T>{
    void OnRecycleItemClick(View v,T o);
}

PS;参数什么的自己定义即可,用什么就定义什么

2.在onBindViewHolder给要添加的view设置点击事件

 @Override
    public void onBindViewHolder(TypeViewHolder holder, int position) {
       ActivityItemModel itemModel = model.getDatalist().get(position);
        holder.textView.setText(itemModel.getName());
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.OnRecycleItemClick(v,itemModel);
            }
        });
    }

使用setOnClickListener并在其中调用接口中的OnRecycleItemClick

3.那么上面listener对象需要定义出来

private OnRecycleItemListener listener;

4.最后一步就是定义一个对外开放的方法

public void addRecycleItemListener(OnRecycleItemListener listener){
        this.listener = listener;
}

到此为止,你可以在activity中给创建出来的adapter实例添加点击事件,并在回调中处理各种事件

5在activity中使用

 //在activity中对recycleView的adapter(listAdapter)添加子项目的点击事件
 listAdapter.addRecycleItemListener(listener);
-------------------------------------------------
 OnRecycleItemListener<Prize> listener = new OnRecycleItemListener<Prize>() {
        @Override
        public void OnRecycleItemClick(View v, final Prize p) {
            switch (v.getId()){
                case R.id.act_list_edit:
                    //在这里处理Item的点击事件即可
                    break;
             }
        }
};
相关文章
|
JavaScript Java 数据库连接
属于Java的协程终于来了!
属于Java的协程终于来了!
属于Java的协程终于来了!
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1243 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1220 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1800 13
|
20天前
|
人工智能 运维 安全
|
4天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
235 127