Adapter 适配器

温馨提示:本文最后更新于2025-11-17 16:54:28,某些文章具有时效性,若有错误或已失效,请在下方留言
Adapter
Adapter

Adapter 对象充当 AdapterView 与其底层数据之间的桥梁。Adapter 负责提供对数据项的访问。

基本使用

页面布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

交互代码

package com.stewednoodles.adaptersapp;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // 1. Adapter View:List View
        listView = findViewById(R.id.listView);

        // 2. Data Source: String Array
        String[] items = {"USA", "Germany", "Japan", "China", "India", "Russia", "Brazil", "Mexico", "Argentina", "Canada"};

        // 3. Adapter: act as a bridge between the 'data source' and the 'AdapterView'
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);

        // Link ListView with the adapter
        listView.setAdapter(adapter);
    }
}

运行效果

运行效果图
运行效果图

自定义 Adapter

布局样式

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="item1"
        android:textColor="#D91212"
        android:textSize="48sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

自定义Adapter

package com.stewednoodles.adaptersapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
 * Created by stewednoodles.
 * 自定义Adapter
 */
public class MyCustomAdapter extends BaseAdapter {
    private Context context;
    private String[] items;

    public MyCustomAdapter(Context context, String[] items) {
        this.context = context;
        this.items = items;
    }

    /**
     * 获取列表项的数量
     * @return
     */
    @Override
    public int getCount() {
        return items.length;
    }

    /**
     * 获取列表项的数据
 }
     * @param position Position of the item whose data we want within the adapter's
     * data set.
     * @return Returns the data item at the given position
     */
    @Override
    public Object getItem(int position) {
        return items[position];
    }

    /**
     * 获取列表项的ID
 }
     * @param position The position of the item within the adapter's data set whose row id we want.
     * @return Returns a unique Identifier for the item at the given position
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 获取列表项的View
     * @return Displays the data at a position in the data set
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.my_list_item, parent, false);
            holder = new ViewHolder();
            holder.textView = convertView.findViewById(R.id.text1);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textView.setText(items[position]);
        return convertView;
    }

    // Holds references to the views within an item Layout
    static class ViewHolder {
        TextView textView;
    }
}

使用自定义Adapter

package com.stewednoodles.adaptersapp;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // 1. Adapter View:List View
        listView = findViewById(R.id.listView);

        // 2. Data Source: String Array
        String[] items = {"USA", "Germany", "Japan", "China", "India", "Russia", "Brazil", "Mexico", "Argentina", "Canada"};

        // 3. Adapter: act as a bridge between the 'data source' and the 'AdapterView'
//        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
        MyCustomAdapter adapter = new MyCustomAdapter(this, items);

        // Link ListView with the adapter
        listView.setAdapter(adapter);
    }
}

运行效果

最终的运行效果,如下图所示

运行效果
运行效果
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容