recyclerView的写法--实现长按item弹出菜单功能,每个item实现偏移

导入到工程中

方式一:

在你的工程上点击右键,弹出如下图片,大家看图吧
1.右键工程名,选中Modulder setting
右键工程名,选中Modulder setting
2.点击app,再选中dependence
在这里插入图片描述
3.找到右边的加号,选中library
在这里插入图片描述
4.搜索框中输入recycler
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092816190891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JhcnJ5amFja2V0,size_16,color_FFFFFF,t_70#pic_center

点击ok后,这个recyclerview-v7的包就引用到自己的工程里了,也不用管那个build.jradle文件了,打开会发现已经自动填好了.
方式二:
打开app/build.gradle文件,在dependcies中添加如下内容

compile 'com.android.support:recyclerview-v7:24.0.0'

注意对于AS为3.6版本,SDK版本大于28的建议使用

implementation 'androidx.recyclerview:recyclerview:1.0.0'

recyclerView的使用

在活动中成功使用recyclerView要设置两个参数,布局和适配器。
如果要实现长按弹出菜单的功能,要调用registerForContextMenu(View v);这个函数。同时,适配器的ViewHolder类要实现响应的接口View.OnCreateContextMenuListener接口。

onBindViewHolder方法中要实现RecyclerView控件中每一个item View的大部分功能。因为 onBindViewHolder的执行是在创建ViewHolder,且已知itemView的个数后才调用的。对于每一个item进行数据绑定时都会调用一次

rvContract = (RecyclerView) findViewById(R.id.rvContract);
//传入线性布局
rvContract.setLayoutManager(new LinearLayoutManager(this));
mList = new ArrayList<>();
mAdapter = new ContactAdapter(this, mList);
rvContract.setAdapter(mAdapter);
registerForContextMenu(rvContract);
/**
 * 长按item弹出菜单后,点击某一菜单项会回调这一方法
 * item中带有一个intent属性。
 * itemId对应着菜单的id
 *
 * @param item 所点击的菜单项
 * @return
 */
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case 0://修改
         break;
        case 1://删除
            deleteContact(item);
            break;
    }
    return super.onContextItemSelected(item);
}

实现rv的适配器类,由于rv的封装就要求有viewHolder类,故可以先写内部静态类ContractViewHolder extends RecyclerView.ViewHolder。

/**
 * @ 功能适配器中必须要有实体类,也是bean
 * 1.数据的绑定,2.创建viewHolder--布局加载器--上下文对象
 * Ctreate by barry on 2020/9/20.
 */
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContractViewHolder> {
    private Context mContext;//null
    private List<ContactBean> mList;//null
    private LayoutInflater mInflater;//null

    private static final String POSITION_KEY ="POSITION_KEY";

    public ContactAdapter(Context mContext, List<ContactBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
        mInflater = LayoutInflater.from(mContext);
    }

    /**
     * 创建ViewHolder实例,并将item布局加载进入
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public ContractViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //加载item布局
        View view = mInflater.inflate(R.layout.recyclerview_item_contact,parent,false);
        ContractViewHolder viewHolder = new ContractViewHolder(view);
        return viewHolder;
    }

    /**
    
     * 对vieholder对象进行数据赋值
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull ContractViewHolder holder, int position) {
        ContactBean contact = mList.get(position);
        holder.tvName.setText(contact.getName());
        holder.tvPhone.setText(contact.getPhone());

    }

    /**
     * 统计item个数
     * 如果直接返回一个固定的数字,就会有一些空的item项
     * @return
     */
    @Override
    public int getItemCount() {
        return mList.size();
    }

    static class ContractViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{
        private TextView tvName;//null
        private TextView tvPhone;//null

        public ContractViewHolder(@NonNull View itemView) {
            super(itemView);
            tvName = (TextView)itemView.findViewById(R.id.tv_name);
            tvPhone = (TextView)itemView.findViewById(R.id.tv_phone);
            //由于recycleView没有实现长按弹出菜单的接口,要在ViewHolder中自己实现该接口
            //setOnCreateContextMenuListener(OnCreateContextMenuListener l)
            // 由于ContractViewHolder已经实现该接口,故直接传入this
            itemView.setOnCreateContextMenuListener(this);

        }
        //创建响应的菜单

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            //获取当前所按的item的下标,回传到MainActivity中供onContextItemSelected使用。
            int position = getAdapterPosition();
            Intent intent = new Intent();//这里不需要使用intent,来跳转
            intent.putExtra(POSITION_KEY,position);

            menu.setHeaderTitle("编剧");
            //菜单的选项时通过add来直接添加,通过setIntent(),让每一个MenuItem自带了一个intent
            menu.add(0,0,0,"修改").setIntent(intent);
            menu.add(0,1,0,"删除").setIntent(intent);

        }
    }
}

创建一个实体类来存储item内容。
注意,为了让bean的数据能在活动之间相互传输,要实现序列化1.seriable 2.Parcelable。安卓提供了序列化的插件。
参考如何使用Parcelable完成序列化操作

/**由于要在不同的活动之间进行传递,该类必须实现序列化1.seriable 2.Parcelable
 * @ 功能
 * Ctreate by barry on 2020/9/22.
 */
public class ContactBean implements Parcelable {
    private int id;
    private String name;
    private String phone;

item的偏移,实现更好的视觉效果。

主要是调用addItemDecoration()方法,该方法需要传入一个ItemDecoration对象。
在安卓中,系统已经实现了ItemDecoration的实现类,DividerItemDecoration类。

DividerItemDecoration.HORIZONTAL
表示在水平列之间加间隔
DividerItemDecoration.VERTICAL
表示在竖直列之间加间隔

mRvGrid.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL));

该类的缺点:每个偏移的间隔只有1dp.如果要大一点的间隔偏移,还是要自己定义一个类来继承ItemDecoration。
GridSpaceItemDecoration.java

public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {
    private int mSpace;

    public GridSpaceItemDecoration(int mSpace) {
        this.mSpace = mSpace;
    }

    /**
     * 设置itemView的偏移量,每一个itemView都会调用这一函数
     * @param outRect Item的矩形边界对象,里面由各个item的各边偏移量。
     * @param view ItemView
     * @param parent  RecyclerView
     * @param state RecyclerView的状态
     */
    @Override
    public void getItemOffsets(@NonNull Rect outRect,
                               @NonNull View view, @NonNull RecyclerView parent,
                               @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //每一个itemView 左侧都有一个距离
        outRect.left = mSpace;
    }
}

偏移量会使得未偏移的itemView的宽度或者高度会减少偏移量dp.
效果如下
在这里插入图片描述
同时可以通过移动View,来使第一幅的左边框消失。

  private void getRecyclerViewOffset(RecyclerView parent){
//        View 的margin
//        margin 为正 ,则View会距离边界产生一个距离
//        margin 为负 ,则View会超出边界产生一个距离
        LinearLayout.LayoutParams  layoutParams= (LinearLayout.LayoutParams) parent.getLayoutParams();
        layoutParams.leftMargin = -mSpace;
        parent.setLayoutParams(layoutParams);
    }

在构造器中调用该函数。

public GridSpaceItemDecoration(int mSpace, RecyclerView parent) {
    this.mSpace = mSpace;
    getRecyclerViewOffset(parent);
}

在MainActivity中调用
getResources().getDimensionPixelSize(R.dimen.albumMarginSize),获取定义在dimen.xml的数据大小。

mRvGrid.addItemDecoration(new GridSpaceItemDecoration(getResources().
        getDimensionPixelSize(R.dimen.albumMarginSize),mRvGrid));

实现ViewHold的内部点击事件

RecyclerView没有setOnItemClickListener这样的注册监听器方法,而是需要我们给子项具体的View去注册点击事件。修改适配器FruitAdapter的onCreateViewHolder方法。或者在bindViewHold()进行注册

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHold {
        val binding=FruitItemBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        val viewHolder=ViewHold(binding)
        viewHolder.fruitName.setOnClickListener {}
        viewHolder.fruitImage.setOnClickListener{}
        return viewHolder
    }
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是一种功能强大的工具,其目的是用于深度学习模型的操作。该模块使得开发人员能够在OpenCV环境中直接运用已经训练好的深度学习网络,以执行图像识别、目标检测、图像分割等多种功能。DNN模块能够兼容多种深度学习框架的模型,包括TensorFlow、Caffe、ONNX等。 一、DNN模块概述 OpenCV的DNN模块是为了简化深度学习模型的集成过程而专门设计的,它允许开发人员加载预先训练好的神经网络模型,并在图像数据上执行前向传播操作。借助这个模块,用户可以选用GPU或者CPU来提升计算效率,从而构建出高效的应用程序。 二、目标检测案例 在OpenCV的DNN模块中,目标检测是一个常见的应用情形。例如,可以选用SSD(Single Shot Multibox Detector)、YOLO(You Only Look Once)或者 Faster R-CNN 等模型进行实时的目标检测。这些模型能够识别并定位图像中的多个对象,并返回每个对象的类别和边界框坐标。 三、模型转换:PB到PBTXT 在OpenCV中运用TensorFlow模型时,通常需要处理的是`.pb`格式的模型文件,这是TensorFlow的二进制模型文件格式。然而,为了能够读取模型的结构信息,我们需要`.pbtxt`格式的文本文件。转换过程涉及解析`.pb`文件并将其结构信息导出为`.pbtxt`格式,这样做可以让人清晰地了解网络层和参数的配置。在OpenCV中,可以使用`tf.train.write_graph()`函数将.pb...
内容概要:本文围绕虚拟同步发电机(VSG)接入弱电网的序阻抗建模与稳定性分析开展研究,基于Matlab/Simulink平台搭建详细的仿真模型,系统复现并验证相关理论方法。研究重点包括VSG在弱电网条件下的正负序阻抗特性建模、基于小信号分析的扫频法建模流程、系统阻抗交互特性及潜在的失稳机理分析。通过具体仿真案例,深入探讨了VSG控制参数对系统稳定性的影响,旨在为新能源并网系统的稳定运行提供理论依据与技术支撑。该内容属于电力电子与电力系统稳定性交叉领域的前沿课题,具有重要的学术价值与工程应用前景。; 适合人群:具备电力系统分析、电力电子变换器控制等基础知识,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、电力系统稳定性研究的研究生、科研人员及工程师;有志于复现高水平期刊论文中阻抗建模与稳定性分析方法的技术开发者。; 使用场景及目标:① 掌握虚拟同步发电机在弱电网中的序阻抗建模理论与实现方法;② 理解并实践基于扫频法的小信号稳定性分析全过程;③ 应用于构网型变流器、虚拟同步机等先进并网技术的稳定性研究与仿真验证。; 阅读建议:建议结合所提供的Simulink仿真模型与技术资料,按照文档结构循序渐进地学习,重点关注建模原理、仿真参数设置与结果分析过程,同时参考链接中的完整资源进行代码调试与深入探究。
内容概要:本文系统阐述了基于主从博弈理论的配电网-多微网双层优化模型,构建了以配电网为领导者、多微网为追随者的非合作博弈框架,旨在实现多方利益均衡下的协同优化调度。模型充分考虑了分布式能源接入背景下电力市场环境中配电网与多个微网间的能量交互关系与利益冲突,通过建立上层配电网成本最小化与下层各微网收益最大化的目标函数,并结合系统运行约束条件,形成完整的双层优化问题。研究采用多种智能优化算法(如遗传算法、粒子群算法等)对模型进行求解与对比分析,验证了所提模型在提升系统经济性、促进新能源消纳方面的有效性,同时评估了不同算法在收敛速度、求解精度和稳定性方面的性能差异。所有模型构建与仿真分析均通过Matlab编程实现,为现代主动配电网与多微网系统的协同运行提供了科学的决策支持与技术路径。; 适合人群:具备电力系统分析、优化理论、博弈论基础及相关数学建模能力,熟悉Matlab编程工具,从事能源互联网、微电网调度、电力市场、分布式能源管理等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于含高比例分布式电源的配电网与多微网协同优化调度实际场景;②为研究主从博弈在能源系统多主体决策中的建模方法提供理论参考与实例支撑;③对比分析不同智能优化算法在复杂非凸双层优化问题中的适用性与性能表现;④服务于学术论文复现、科研课题攻关、工程项目方案设计及教学案例开发。; 阅读建议:建议学习者在理解博弈论基本概念的基础上,结合所提供的Matlab代码逐模块研读,重点关注上下层模型的迭代求解机制、约束处理方式及算法实现细节,鼓励动手修改参数、更换求解算法或拓展模型结构以深化理解并开展二次创新研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值