Android开发仿美团购物左右联动列表

news2025/2/23 2:38:43

概述

Android开发左右联动列表,仿照美团外卖点餐时,左右列表可以联动。

详细

Android开发仿美团购物左右联动列表

概述

左右联动列表是仿照美团外卖点餐时,左右列表可以联动。比如右边列表会有小项对应左边的,滑动时会置顶,滑动到下一个小项时,置顶会切换,并且左边列表的项也相应切换。同理,左边项的点击,右边的列表也会跟着滚动,对应的小项也会置顶。

详细

一、运行效果如下:

二、实现过程:

1、右边列表adapter

 

    public class RightAdapter extends RecyclerView.Adapter {
        private ArrayList<FoodBean> mList;
        private LayoutInflater mLayoutInflater;
        public RightAdapter(LayoutInflater layoutInflater, ArrayList<FoodBean> list) {
            this.mList = list;
            mLayoutInflater = layoutInflater;
        }
        private FoodBean getItem(int position) {
            return mList.get(position);
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new RightViewHolder(
                    mLayoutInflater.inflate(R.layout.listitem_right_content, parent, false));
        }
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            FoodBean target = getItem(position);
            if (holder instanceof RightViewHolder) {
                ((RightViewHolder) holder).bindBean(target);
            } else {
                throw new IllegalStateException("Illegal state Exception onBindviewHolder");
            }
        }
        @Override
        public int getItemCount() {
            return mList.size();
        }
        private class RightViewHolder extends RecyclerView.ViewHolder {
            private TextView tvFoodTitle;
            private ImageView ivFood;
            RightViewHolder(View itemView) {
                super(itemView);
                tvFoodTitle = (TextView) itemView.findViewById(R.id.tv_food_title);
                ivFood = (ImageView) itemView.findViewById(R.id.iv_food);
            }
            void bindBean(final FoodBean bean) {
                tvFoodTitle.setText(bean.getFoodTitle());
                ivFood.setImageResource(bean.getImageResId());
            }
        }
    }  

其中FoodBean.class

    public class FoodBean {
        private int imageResId;
        private String foodTitle;
        //这是每小项的标题,用来滑动置顶用
        private String itemTitle;
        public FoodBean(int imageResId, String foodTitle,String itemTitle) {
            this.imageResId = imageResId;
            this.foodTitle = foodTitle;
            this.itemTitle = itemTitle;
        }
        public FoodBean(int imageResId, String foodTitle) {
            this.imageResId = imageResId;
            this.foodTitle = foodTitle;
        }
        public String getItemTitle() {
            return itemTitle;
        }
        public void setItemTitle(String itemTitle) {
            this.itemTitle = itemTitle;
        }
        public int getImageResId() {
            return imageResId;
        }
        public void setImageResId(int imageResId) {
            this.imageResId = imageResId;
        }
        public String getFoodTitle() {
            return foodTitle;
        }
        public void setFoodTitle(String foodTitle) {
            this.foodTitle = foodTitle;
        }
    }
2、左边adapter
    public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.LeftViewHolder> {
        private ArrayList<LeftBean> mList;
        private OnItemClickListener onItemClickListener;
        public LeftAdapter( ArrayList<LeftBean> list) {
            this.mList = list;
        }
        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }
        private LeftBean getItem(int position) {
            return mList.get(position);
        }
        @Override
        public LeftViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.listitem_left_content,parent,false);
            return new LeftViewHolder(view);
        }
        @Override
        public void onBindViewHolder(LeftViewHolder holder, int position) {
            LeftBean target = getItem(position);
            holder.tvTitle.setText(target.getTitle());
            if (target.isSelect()){
                holder.itemView.setBackgroundColor(ContextCompat.getColor(holder.itemView.getContext(), R.color.white));
            } else {
                holder.itemView.setBackgroundColor(ContextCompat.getColor(holder.itemView.getContext(), R.color.c_aaa));
            }
            //绑定监听事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.v("onClick",position+"\t");
                    if (onItemClickListener != null){
                        onItemClickListener.onItemClicked(getItem(position).getRightPosition());
                    }
                    for (LeftBean bean:mList){
                        bean.setSelect(false);
                    }
                    getItem(position).setSelect(true);
                    notifyDataSetChanged();
                }
            });
        }
        @Override
        public int getItemCount() {
            return mList.size();
        }
        public static class LeftViewHolder extends RecyclerView.ViewHolder {
            private final TextView tvTitle;
            //private View cl_left_item;
            LeftViewHolder(View itemView) {
                super(itemView);
                tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
            }
        }
        interface OnItemClickListener {
            void onItemClicked(int rightPosition );
        }
        public void setCurrentPosition(int rightPosition){
            for (LeftBean bean:mList){
                if (bean.getRightPosition() == rightPosition){
                    bean.setSelect(true);
                } else {
                    bean.setSelect(false);
                }
            }
            notifyDataSetChanged();
        }
        public String getCurrentTitle(){
            String currentTitle = "";
            for (LeftBean bean:mList){
                if (bean.isSelect()){
                    currentTitle = bean.getTitle();
                    break;
                }
            }
            return currentTitle;
        }
    }  

主要处理点击左边项目的选中状态,并将右边的小项的position回调出去给右边列表使用
其中LeftBean.class

    public class LeftBean {
        //记录右边列表置顶项所在的item的位置
        private int rightPosition;
        private String title;
        //设置是否选中,改变背景色
        private boolean isSelect;
        public LeftBean(int rightPosition, String title) {
            this.rightPosition = rightPosition;
            this.title = title;
        }
        public boolean isSelect() {
            return isSelect;
        }
        public void setSelect(boolean select) {
            isSelect = select;
        }
        public int getRightPosition() {
            return rightPosition;
        }
        public void setRightPosition(int rightPosition) {
            this.rightPosition = rightPosition;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
    }  

三、项目结构图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字IC验证高频面试问题整理—附答案(三)

最近大家无不在讨论IC秋招&#xff0c;秋招想必缺的就是面试题目了。这不就来了~ 共150道验证高频面试题整理~含答案&#xff08;文末可领取全部题目&#xff09; Q1.二进制码、格雷码、独热码的特点 二进制码&#xff1a;基本的机器语言&#xff0c;每一位只能是0或1&…

K8s:一文带你认知 CRI,OCI,容器运行时,Pod 之间的关系

写在前面 博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充课程是免费的&#xff0c;有华为云账户就可以看&#xff0c;适合理论认知&#xff0c;感觉很不错。有需要的小伙伴可以看看&#xff0c;链接在文末理解不足小伙伴帮忙指正 对每个人而言&#xff0c…

<硬件设计> 阻抗设计(一) 阻抗及其模型介绍

目录 01 阻抗相关介绍 阻抗(Electrical Impedance) 阻抗匹配(Impedance Matching) 常规的阻抗线(Impedance Matching) 02 微带线与带状线 微带线(MicroStrip) 带状线(Stripline) 03 文章总结 大家好&#xff0c;这里是程序员杰克。一名平平无奇的嵌入式软件工程师。 在…

mysql8.0以上忘记密码的重置方法 - window系统

1、关闭 mysql 服务&#xff0c;以 管理员身份 运行命令提示符工具&#xff0c;执行下面的命令 net stop mysql可以在任务管理器的服务中查看状态 2、跳过 mysql 权限验证&#xff0c;以管理员身份运行 cmd&#xff0c;进入 mysql 的安装 bin 目录&#xff0c;执行如下指令 m…

另一棵树的子树

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 另一棵树的子树 题目要求 题目链接 示例 解答 方法一、 递归法 实现思路 依次将树中的每一棵子树都与目标树比较&#xff0c;如果有子树与目标…

树多选搜索查询,搜索后选中状态仍保留

<template><div class"half-transfer"><div class"el-transfer-panel"><div><el-checkbox v-model"selectAll" change"handleSelectAll">全部</el-checkbox></div><el-input v-model&qu…

使用gn+Ninja构建项目

使用下载编译好的gn和ninja报错 先下载了gn的源码[gn.googlesource.com/gn]&#xff0c;然后编译报错&#xff0c;就直接下载了了编译号的gn和Ninja&#xff0c;然后写了Helloworld应用的BUILD.gn&#xff0c;然后将"gn\examples\simple_build\build"拷贝至当前目录…

Qt之遮罩—实现不规则窗体

Qt之setMask() 前言 使用遮罩可以将窗口形状多样化&#xff0c;变成各种各样的图片或者图形&#xff0c;先看一下效果吧&#x1f447; 可以看到现在的窗口是一束花&#xff0c;而我们拖动花就相当于拖动窗口&#xff0c; setMask()只是说可以让哪些地方可见哪些地方不可见其…

Doris最大链接数优化

问题背景&#xff1a; 用户在使用Doris的时候&#xff0c;当访问用户过多时会报Reach limit of connections&#xff0c;针对这种情况需要调整Doris最大连接数&#xff0c;具体做法如下。 解决办法&#xff1a; Session变量设置 SET PROPERTY FOR root max_user_connection…

网络优化工程师,你真的了解吗?

一、5G网络优化工程师到底是什么&#xff1f; 5G&#xff0c;就是我们通常所说的第五代移动通信标准&#xff0c;属于目前最热门的新技术趋势。随着2019年5G技术进入正式的商用阶段&#xff0c;拥有广阔的发展前景&#xff0c;备受瞩目。“5G工程师”这个词是一个概念词&#x…

新增!视频智能分析/AI算法智能分析网关V5告警功能添加教程来咯!

智能分析网关系列是基于边缘AI计算技术&#xff0c;可对前端摄像头采集的视频流进行实时检测分析&#xff0c;能对监控画面中的人、车、物进行识别&#xff0c;可实现的检测包括&#xff1a;人脸检测与识别、车辆检测与识别、烟火识别、安全帽/反光衣识别、区域入侵识别等&…

用P,V操作解决进程同步问题的解题步骤(优化版)

蓝颜色是格外注意的 还有读读共享&#xff0c;读写互斥问题。 要背会四个模式&#xff0c;套用模式 例题讲解1&#xff09;生产者-消费者问题 一般意义的“生产者—消费者”问题&#xff1a;N个buffer&#xff0c;多个生产者&#xff0c;多个消费者&#xff0c;循环存取buffer。…

光电水表和脉冲水表有什么区别?

随着科技的不断发展&#xff0c;水表也在不断地更新换代。在众多种类的水表中&#xff0c;光电水表和脉冲水表因其高精度、稳定性能和易于管理等优点&#xff0c;逐渐成为现代家庭的首选。那么光电水表和脉冲水表有什么区别呢?下面就由小编来带大家了解下吧。 一、工作原理上的…

ES是一个分布式全文检索框架,隐藏了复杂的处理机制,核心数据分片机制、集群发现、分片负载均衡请求路由

ES是一个分布式框架&#xff0c;隐藏了复杂的处理机制&#xff0c;核心数据分片机制、集群发现、分片负载均衡请求路由。 ES的高可用架构&#xff0c;总体如下图&#xff1a; 说明&#xff1a;本文会以pdf格式持续更新&#xff0c;更多最新尼恩3高pdf笔记&#xff0c;请从下面…

linux centos7 bash中字符串反向输出

给定一个字符串&#xff0c;如何反向(倒序)输出&#xff1f; 字符串反转的方法&#xff1a;a.对各个字符位置进行循环调换&#xff08;从原字符串左边取出放在新字符串的右边&#xff1b;从原字符串右边取出放在新字符串的左边&#xff09;。b.对各个字符由水平排列转为垂直排…

【第四阶段】kotlin语言的list遍历

package Stage4fun main() {val list listOf(1,2,3,4,5,6,7,8,9)//第一种方式 for()println("第一种方式遍历元素&#xff1a;")for (i in list){print("元素&#xff1a;$i")}println()//第二种方式forEachprintln("第二种方式遍历元素&#xff1a;…

微信短链跳转到小程序指定页面调试

首先说下背景&#xff1a;后端给了短链地址&#xff0c;但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下&#xff1a; 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

满足每个用户的分析需求,奥威BI数据可视化工具真没吹牛

我们都知道&#xff0c;随着BI商业智能技术的发展&#xff0c;现在做数据可视化分析的效率越来越高&#xff0c;操作难度也越来越低&#xff0c;但真能随时满足每个用户的分析需求&#xff1f;奥威BI数据可视化工具真没吹牛。 在奥威BI数据可视化工具上还真有一种功能可及时且…

20个值得收藏的WebGL性能优化技巧

WebGL 是一项功能强大的技术&#xff0c;允许开发人员使用基于 OpenGL ES 图形标准的 WebGL API 在 Web 浏览器中创建 3D 图形。 然而&#xff0c;由于在 Web 环境的限制下实时渲染 3D 图形的复杂性&#xff0c;优化 WebGL 性能可能具有挑战性。 推荐&#xff1a;用 NSDT编辑器…