安卓基础(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.");
相关推荐
rocpp9 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt10 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏11 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我1234512 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_13 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶14 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051315 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质15 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者16 小时前
叠氮酸介绍
android
方白羽16 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app