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;
             }
        }
};
相关文章
|
25天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
34601 136
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
7天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
3345 20
|
20天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7582 22
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
19天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5243 12
|
21天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5975 23
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手