安卓基础(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.");
相关推荐
Yang-Never26 分钟前
Git -> Git使用Patch失败error: patch failed: patch does not apply的解决办法
android·git·android studio
woodWu2 小时前
Android编译时动态插入代码原理与实践
android
百锦再3 小时前
Android Studio 实现自定义全局悬浮按钮
android·java·ide·app·android studio·安卓
百锦再3 小时前
Android Studio 项目文件夹结构详解
android·java·ide·ios·app·android studio·idea
老码识土3 小时前
Kotlin 协程源代码泛读:Continuation
android·kotlin
行墨4 小时前
Replugin 的hook点以及hook流程
android·架构
一一Null4 小时前
Access Token 和 Refresh Token 的双令牌机制,维持登陆状态
android·python·安全·flask
_祝你今天愉快5 小时前
深入理解 Android Handler
android
pengyu6 小时前
【Flutter 状态管理 - 四】 | setState的工作机制探秘
android·flutter·dart
溪饱鱼6 小时前
DHgate爆火背后的技术原因
android·前端·ios