安卓基础(Adapter)

想象一下,你有一堆玩具(数据),这些玩具很特别,每个玩具都是不同的,可能有汽车、飞机、积木等。现在,你想把这些玩具摆放到一个展示柜(显示的界面)里,给大家看。

但问题是,展示柜本身不懂这些玩具,所以你需要一个"搬运工"(Adapter)来帮助你。搬运工的工作就是把每个玩具拿到展示柜里,而且要保证玩具不会乱掉,摆得又整齐又好看。

搬运工的任务就是:

  1. 拿到玩具:搬运工要知道这些玩具是什么样的(就是数据)。
  2. 放到展示柜里:把玩具按顺序摆好,确保大家能看到(就是显示在界面上)。

在 Android 编程中,Adapter 就是这个"搬运工",它帮助你把数据(比如一串文字、图片或者信息)摆放到屏幕上,显示给用户看。比如当你在手机上看到一个联系人列表时,Adapter 就是把这些联系人的名字、电话等信息展示出来的"搬运工"。

例子:

假设你有一些水果,想放到一个水果篮里给朋友们看:

  1. 水果(数据):苹果、香蕉、橙子。
  2. 水果篮(界面):就是一个可以装水果的容器。
  3. 搬运工(Adapter):帮你把水果一个个放到篮子里,确保每个水果都有地方放,大家也能清楚看到。

就是这么简单!Adapter 就是帮助我们把数据放到界面上的"搬运工"。

复制代码
水果列表: ["苹果", "香蕉", "橙子"]
显示结果:
----------------------
| 苹果               |
----------------------
| 香蕉               |
----------------------
| 橙子               |
----------------------

设置 ListView

现在我们要把这个 Adapter 设置给一个 ListView,这样水果的名字就会在界面上显示出来。

复制代码
// MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 准备数据
        List<String> fruitList = new ArrayList<>();
        fruitList.add("苹果");
        fruitList.add("香蕉");
        fruitList.add("橙子");

        // 创建Adapter并设置到ListView
        FruitAdapter adapter = new FruitAdapter(this, fruitList);
        ListView listView = findViewById(R.id.fruit_list);
        listView.setAdapter(adapter);
    }
}

setContentView 就是将你编写的布局文件 activity_main.xml 显示出来,形成应用的界面。

设置 ListView 在界面中显示:

复制代码
<!-- activity_main.xml -->
<ListView
    android:id="@+id/fruit_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

2. ListView简单使用

ListView 是用于显示垂直滚动列表的控件,它会通过适配器(Adapter)来管理数据源。

基本使用:
复制代码
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
    private Context context;  // 上下文对象,用来获取系统资源
    private String[] data;    // 数据源

    // 构造函数,传入上下文和数据源
    public MyAdapter(Context context, String[] data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.length;  // 返回数据源的长度
    }

    @Override
    public Object getItem(int position) {
        return data[position];  // 返回指定位置的数据项
    }

    @Override
    public long getItemId(int position) {
        return position;  // 返回数据项的 ID,这里简单地使用位置作为 ID
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 如果 convertView 为空,说明需要重新创建视图
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false);
        }

        // 获取 TextView 控件,并设置文本内容
        TextView textView = convertView.findViewById(android.R.id.text1);
        textView.setText(data[position]);

        return convertView;  // 返回生成的视图
    }
}

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private String[] data = {"Item 1", "Item 2", "Item 3", "Item 4"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.listView);
        MyAdapter adapter = new MyAdapter(this, data);
        listView.setAdapter(adapter);
    }
}

显示主要活动布局,找到ListView,ListView设置适配器

在布局文件 (activity_main.xml) 中:

复制代码
<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

MyAdapter 中实现 getCount() 方法:

复制代码
ListView listView = findViewById(R.id.listView);
MyAdapter adapter = new MyAdapter(this, data);
listView.setAdapter(adapter);

// 这里不会直接调用 listView.getCount(),但它实际上会通过适配器的 getCount() 来确定数量
int itemCount = adapter.getCount();  // 这里通过适配器手动调用
Log.d("Item count", "The list has " + itemCount + " items.");
相关推荐
weiggle14 小时前
第七篇:状态提升与单向数据流——架构设计的核心
android
xingpanvip15 小时前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
goldenrolan15 小时前
A公司物料替代测试系统 v1.7:从需求到 exe/apk 的 AI 辅助全链路实践
android·自动化测试·软件测试·python·ai
AC赳赳老秦16 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
kiros_wang18 小时前
Android 常见面试题
android
货拉拉技术18 小时前
Hook植入日志协助定位问题方案
android
FlightYe19 小时前
Android投屏MirrorCast全链路
android
Ehtan_Zheng19 小时前
Kotlin const val vs val:字节码、性能与隐藏陷阱详解
android·kotlin
墨狂之逸才19 小时前
Android TV 垃圾应用清理指南
android
源来猿往19 小时前
记ffmpeg-8.1.1 之Android库编译(window)
android·ffmpeg