当前位置: 首页 > ai >正文

安卓基础(适配器和RecyclerView )

RecyclerView 

// 🍎 第一步:准备水果数据(假装这是你的数据)
List<String> fruitList = new ArrayList<>();
fruitList.add("苹果");
fruitList.add("香蕉");
fruitList.add("橘子"); // ...继续添加其他水果// 🚚 第二步:创建 RecyclerView 的 Adapter(卡车司机)
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.FruitHolder> {private List<String> fruits;// 构造函数:传入水果数据public FruitAdapter(List<String> fruits) {this.fruits = fruits;}// 🛠️ 工作1:创建装水果的盒子(ViewHolder)@NonNull@Overridepublic FruitHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 用布局文件 item_fruit.xml 生成一个盒子View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_fruit, parent, false);return new FruitHolder(view);}// 🎁 工作2:把水果放进盒子@Overridepublic void onBindViewHolder(@NonNull FruitHolder holder, int position) {String fruit = fruits.get(position);holder.fruitName.setText(fruit); // 设置水果名字}// 📊 工作3:告诉卡车有多少水果要运@Overridepublic int getItemCount() {return fruits.size();}// 📦 盒子的设计(静态内部类,避免内存泄漏)public static class FruitHolder extends RecyclerView.ViewHolder {TextView fruitName;public FruitHolder(@NonNull View itemView) {super(itemView);fruitName = itemView.findViewById(R.id.tv_fruit_name); // 找到盒子里的文字区域}}
}// 🌟 第三步:在 Activity 中绑定 RecyclerView
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置排列方式(竖着排)
FruitAdapter adapter = new FruitAdapter(fruitList);
recyclerView.setAdapter(adapter);

🧩 配套的布局文件(item_fruit.xml

<!-- 每个水果盒子的样式 -->
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tv_fruit_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="20dp"android:textSize="18sp"/>

🌈 代码比喻

  • FruitAdapter​:就像快递公司的 ​​“装箱机器人”​​,负责把水果装进标准盒子里。
  • onCreateViewHolder​:机器人第一次看到盒子时,​​从模板(item_fruit.xml)造新盒子​​。
  • onBindViewHolder​:机器人把具体的水果(数据)塞进盒子里。
  • FruitHolder​:盒子的设计图纸,规定每个盒子长什么样。

下次滑动列表时,记得对手机说:“机器人又在回收盒子啦!” 😆

  • ​Adapter 是乐高大师​​:把乱糟糟的积木变成漂亮的小火车!
  • ​RecyclerView 是轨道​​:只放得下 5 节车厢,但 Adapter 会偷偷回收滑出屏幕的车厢,改装成新车厢~

🚚 ​​Adapter 代码(Java版)​

// 🍎 快递员:水果搬运工(Adapter)
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.FruitHolder> {// 三个重要东西:private Context context;       // 📍 位置(在哪显示)private List<String> fruits;   // 🍇 水果清单(数据)private ItemClickListener listener; // 🖐️ 小手(点击监听)// 快递员的工具包(构造函数)public FruitAdapter(Context context, List<String> fruits, ItemClickListener listener) {this.context = context;this.fruits = fruits;this.listener = listener;}// 🌟 超能力1:造车厢!(用模板拼装)@Overridepublic FruitHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 用图纸 item_fruit.xml 造车厢View view = LayoutInflater.from(context).inflate(R.layout.item_fruit, parent, false);return new FruitHolder(view); // 返回一个装好的车厢}// 🌟 超能力2:贴水果标签!(绑定数据)@Overridepublic void onBindViewHolder(FruitHolder holder, int position) {String fruit = fruits.get(position); // 拿到第几个水果holder.tvFruit.setText(fruit); // 贴在车厢上// 点击车厢时,告诉"小手"(监听器)holder.itemView.setOnClickListener(v -> {if (listener != null) {listener.onItemClick(position);}});}// 🌟 超能力3:数水果!(告诉火车有多少节)@Overridepublic int getItemCount() {return fruits.size();}// 🚂 车厢设计图(ViewHolder)public static class FruitHolder extends RecyclerView.ViewHolder {TextView tvFruit; // 车厢里的文字标签public FruitHolder(View itemView) {super(itemView);tvFruit = itemView.findViewById(R.id.tv_fruit); // 找到标签的位置}}// 🖐️ 小手接口(处理点击)public interface ItemClickListener {void onItemClick(int position);}
}

📦 ​​配套的 XML 布局(item_fruit.xml)​

<!-- 每个小车厢的样式 -->
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><!-- 显示水果名字的标签 --><TextViewandroid:id="@+id/tv_fruit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:textColor="#000000"/></LinearLayout>

🌟 ​getItemCount() 的作用​

就是快递员对着包裹山大喊:​​“老板!今天要送多少件货啊?”​
然后老板回答:​​“有 3 个水果包裹,5 本书包裹,总共 8 件!”​

在代码中,这个方法告诉 RecyclerView ​​需要显示多少项数据​​!

public class SimpleAdapter extends RecyclerView.Adapter<...> {private List<String> dataList; // 数据源(比如水果列表)@Overridepublic int getItemCount() {// 返回数据总数,比如 dataList 有 10 个水果,就显示 10 项return dataList.size(); }
}

💥 ​​如果忘记写这个方法(或者返回 0)​

RecyclerView 会懵圈:​​“到底要显示多少项?0 项?那我不显示了!”​
结果就是 ​​空白页面​​,什么也看不到!

🌈 ​​一句话总结​

getItemCount() = 告诉 RecyclerView 数据有多少条,一条数据对应一个列表项!


// 🐯 动物园动物信息适配器(处理两种类型:食肉动物、食草动物)
public class ZooAdapter extends RecyclerView.Adapter<ZooAdapter.AnimalHolder> {// 点击监听接口public interface OnAnimalClickListener {void onAnimalClick(int position); // 点击动物项}// 数据private List<Object> animals; // 混合类型数据(Lion/Tiger 或 Deer)private OnAnimalClickListener listener;public ZooAdapter(List<Object> animals, OnAnimalClickListener listener) {this.animals = animals;this.listener = listener;}// 🦁 类型判断@Overridepublic int getItemViewType(int position) {Object animal = animals.get(position);if (animal instanceof Lion || animal instanceof Tiger) {return 0; // 类型0:食肉动物} else {return 1; // 类型1:食草动物}}// 🛠️ 创建视图(两种不同布局)@NonNull@Overridepublic AnimalHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {LayoutInflater inflater = LayoutInflater.from(parent.getContext());View view;if (viewType == 0) {view = inflater.inflate(R.layout.item_carnivore, parent, false); // 食肉动物布局} else {view = inflater.inflate(R.layout.item_herbivore, parent, false); // 食草动物布局}return new AnimalHolder(view);}// 🎨 绑定数据@Overridepublic void onBindViewHolder(@NonNull AnimalHolder holder, int position) {Object animal = animals.get(position);if (animal instanceof Lion) {Lion lion = (Lion) animal;holder.bindCarnivore(lion.getName(), "🦁 食肉动物");} else if (animal instanceof Tiger) {Tiger tiger = (Tiger) animal;holder.bindCarnivore(tiger.getName(), "🐯 食肉动物");} else if (animal instanceof Deer) {Deer deer = (Deer) animal;holder.bindHerbivore(deer.getName(), "🌿 每天吃草");}// 点击事件holder.itemView.setOnClickListener(v -> {if (listener != null) {listener.onAnimalClick(position);}});}// 📊 数据总数@Overridepublic int getItemCount() {return animals.size();}// 🐾 视图承载器static class AnimalHolder extends RecyclerView.ViewHolder {TextView tvName;TextView tvType;ImageView ivIcon;public AnimalHolder(@NonNull View itemView) {super(itemView);tvName = itemView.findViewById(R.id.tvName);tvType = itemView.findViewById(R.id.tvType);ivIcon = itemView.findViewById(R.id.ivIcon);}// 绑定食肉动物数据void bindCarnivore(String name, String type) {tvName.setText(name);tvType.setText(type);ivIcon.setImageResource(R.drawable.ic_lion); // 狮子图标}// 绑定食草动物数据void bindHerbivore(String name, String diet) {tvName.setText(name);tvType.setText(diet);ivIcon.setImageResource(R.drawable.ic_deer); // 鹿图标}}
}

🧩 ​​对应数据结构模型​

// 🦁 食肉动物基类
abstract class Carnivore {abstract String getName();
}class Lion extends Carnivore {@Override String getName() { return "辛巴 Lion"; }
}class Tiger extends Carnivore {@Override String getName() { return "理查德 Tiger"; }
}// 🦌 食草动物
class Deer {String getName() { return "斑比 Deer"; }
}

📦 ​​布局文件示例(item_carnivore.xml)​

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="80dp"android:background="#FFF0F0"android:orientation="horizontal"><ImageViewandroid:id="@+id/ivIcon"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/ic_lion"/><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="8dp"><TextViewandroid:id="@+id/tvName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:textColor="#FF0000"/><TextViewandroid:id="@+id/tvType"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"/></LinearLayout>
</LinearLayout>

🎮 ​​使用示例​

List<Object> animals = new ArrayList<>();
animals.add(new Lion());
animals.add(new Deer());
animals.add(new Tiger());ZooAdapter adapter = new ZooAdapter(animals, position -> {Toast.makeText(this, "点击了:" + position, Toast.LENGTH_SHORT).show();
});recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

通过这个动物园例子,可以清晰看到适配器的核心逻辑:
1️⃣ ​​分类数据​​ → 判断是狮子还是鹿
2️⃣ ​​选择模板​​ → 用不同布局文件
3️⃣ ​​填充内容​​ → 设置名字和图标
4️⃣ ​​处理交互​​ → 点击反馈

就像动物园管理员根据动物种类,选择不同的展示牌和饲养方式 🦁→🌿

http://www.xdnf.cn/news/2404.html

相关文章:

  • 富文本展示前使用DOMPurify进行文本过滤
  • T 电梯维修作业考试精选题目
  • AI大模型知识与医疗项目实践 - Java架构师面试实战
  • Haply MinVerse触觉3D 鼠标—沉浸式数字操作,助力 3D 设计与仿真
  • DeepSeek系列(10):与其他AI工具协同
  • 自然语言to SQL的评估
  • #苍穹外卖# (day 12)
  • 2025年大一ACM训练-搜索
  • 如何创建并使用极狐GitLab 部署令牌?
  • 特征工程四-1:自定义函数find_similar_docs查找最相似文档案例
  • ts全局导入接口
  • 8.Excel:数据验证和下拉列表
  • C++入门小馆: STL 之queue和stack
  • 图像预处理-形态学变换
  • ESP32-S3 入门学习笔记(四):LED实验
  • shell脚本部署disu博客
  • java当中的类加载器
  • 大模型评测调研报告
  • docker compose -p的踩坑经验
  • terraform查看资源建的关联关系
  • PyQt Python列表操作全解析:从基础到实战
  • 北峰专业数字集群通信系统:构建消防指挥调度的智能化基石
  • 中国地区土地覆盖综合数据集
  • DigitalOcean推出Valkey托管缓存服务
  • Lua 第11部分 小插曲:出现频率最高的单词
  • 驼峰命名法(Camel Case)与匈牙利命名法(Hungarian Notation)详解
  • Web开发-JavaEE应用依赖项Log4j日志Shiro验证FastJson数据XStream格式
  • 3、Linux操作系统下,linux的技术手册使用(man)
  • flask返回文件的同时返回其他参数
  • 微服务即时通信系统(十二)---入口网关子服务