安卓基础(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.");
相关推荐
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴2 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android