Android Studio(适配器Adapter)

news/2024/7/16 9:08:29 标签: android studio, android, ide, 安卓, java

认识适配器

在学完并且在做了一个自主项目后,我对适配器有了以下认识:
1. 适配器的作用:
    数据驱动的动态页面列表渲染,所以适配器主要就做了两件事:遍历数据,渲染页面(列表项)。比如我们常见的订单列表,每一项订单项样式是相同的,而订单数据不同。
2. 适配器的参数:
    大部分都是需要我们继承自定义去实现适配器,除非你仅仅用于展示数据不用做任何复杂数据样式和数据交互的列表项。既然是自定义适配器,那么实例化参数就是我们自己定义了,那么适配器参数需要什么呢?
    其一,你在哪个页面使用适配器(这个其实就叫context);
    其二,你要遍历渲染的数据,列表项数据(一般都是List<Object>类型)
    其三:渲染的列表项布局,在android studio>android studio中布局页面都是全局的可引用的(R.layout.my_list_item),所以可以不用作为实例化适配器参数。
    其他:其他呢就没了,准确来说是必要的没了,那么其他参数无非是结合具体业务逻辑来决定。
3. 如何使用适配器
    其一:适配器的使用对象,即我的哪个页面的哪个地方(列表组件)需要使用适配器。
    其二:创建适配器对象,适配器需要哪些参数。
    其三:设置适配器,为使用对象设置适配器。
4. 刷新页面列表项
    数据常指变量,也就是说数据是变化的,那么我们就有需求:更改数据后,及时地自动进行页面数据刷新。
    页面为什么要刷新,因为数据变了,所以拿到最新数据,再重新创建或更新适配器对象,然后重设置适配器就好了。

BaseAdapter

结构

public abstract class BaseAdapter

extends Object implements ListAdapter SpinnerAdapter

        

java.lang.Object

android.widget.BaseAdapter

直接子类

         ArrayAdapter<T>, CursorAdapter, SimpleAdapter

间接子类

        ResourceCursorAdapter, SimpleCursorAdapter

简要

描述

    一个抽象类,是各种适配器的基础,它为简单的列表提供了基本的实现,但也可以根据需要进行定制。
可作用于的页面控件
    ListView:用于显示垂直滚动的单列数据列表。
    GridView:用于显示网格布局的数据列表,支持水平和垂直滚动。
    Spinner:下拉选择框,可通过BaseAdapter来自定义下拉选项的样式和数据。
    ExpandableListView:可展开的列表视图,用于显示具有层次结构的数据列表。
需要重写的方法

    getCount、getItem、getItemId、getView

重写方法说明

int getCount()
    获取传入数据的长度
Object getItem(int i)
    根据索引获取指定的数据项
long getItemId(int i)
    如果结合数据库的话就是获取对应的记录id了,不结合数据库就是获取数据项的索引
View getView(int i, View view, ViewGroup viewGroup)
    数据索引可以获取当前列表项数据,然后可以开始结合数据构建具体的列表项视图。

代码示例
java">private class MyAdapter extends BaseAdapter{
    private Context context;
    private List<String> goodTitles;
    private LayoutInflater layoutInflater;
    
    public MyAdapter(Context context, List<String> goodTitles){
        this.context = context;
        this.goodTitles = goodTitles;
        this.layoutInflater = LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        return goodTitles.length;
    }
    @Override
    public Object getItem(int i) {
        return goodTitles[i];
    }
    @Override
    public long getItemId(int i) {
        return i;
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View itemView = layoutInflater.inflate(MainActivity.this,R.layout.items,null);
        
        goodTitle = itemView.findViewById(R.id.title);
        goodImg = itemView.findViewById(R.id.img);
        goodPrice = itemView.findViewById(R.id.price);
        goodTitle.setText(goodTitles[i]);
        goodImg.setBackgroundResource(goodImgs[i]);
        goodPrice.setText(""+goodPrices[i]);
        
        return itemView;
    }
}
优化getView
java">// 优化getView的原因主要是避免列表项视图的重复构建

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    MyHolder myHolder = null;
    if(view == null){
        view = View.inflate(MainActivity.this,R.layout.items,null);
        MyHolder = new ViewHolder(view);
        view.setTag(myHolder);
    }else{
        myHolder = (ViewHolder) view.getTag();
    }
    myHolder.goodTitle.setText(goodTitles[i]);
    myHolder.goodImage.setBackgroundResource(goodImgs[i]);
    myHolder.goodPrice.setText(""+goodPrices[i]);

    return view;
}

class MyHolder{
    TextView goodTitle;
    ImageView goodImage;
    TextView goodPrice;
    public MyHolder(View view){
        this.goodTitle = view.findViewById(R.id.title);
        this.goodImage = view.findViewById(R.id.img);
        this.goodPrice = view.findViewById(R.id.price);
    }
}

 SimpleAdapter

简要

继承自BaseAdapter,实现了BaseAdapter的抽象方法,可以实例化直接使用。
public SimpleAdapter(Context context,
                    List<?extends Map<String,?>> data,
                    int resource,
                    String[] from,
                    int[] to
                    )

context:上下文对象,用于访问应用程序资源。
data:数据源,它通常是一个包含 Map 对象的列表,每个 Map 对象表示一条数据。
resource:用于指定列表项的布局资源 ID。
from:用于指定数据中的键名,表示要展示在布局中的数据项。

to:用于指定布局中的视图资源 ID,表示数据应该展示在布局中的哪个视图上。


可作用于的控件ListView、GridView、Spinner

代码示例
java">// 下面是一个简单示例,它将一组数据适配到ListView中进行展示

public class MainActivity extends Activity {

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

        // 准备数据源,这里使用 List<Map<String, Object>> 形式
        List<Map<String, Object>> dataList = new ArrayList<>();
        Map<String, Object> data1 = new HashMap<>();
        data1.put("name", "Alice");
        data1.put("age", 20);
        Map<String, Object> data2 = new HashMap<>();
        data2.put("name", "Bob");
        data2.put("age", 25);
        dataList.add(data1);
        dataList.add(data2);

        // 指定数据对应的 key
        String[] from = {"name", "age"};

        // 指定数据展示的视图资源 ID
        int[] to = {R.id.text_name, R.id.text_age};

        // 创建 SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, dataList,
                R.layout.list_item, from, to);

        // 获取 ListView
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(simpleAdapter);
    }
}

ArrayAdapter

简要

简述:
    继承自BaseAdapter,可以直接实例化使用,该适配器有个重要的特点就是数据源单一,意味着ArrayAdapter只能渲染列表项单一的控件。
    
ArrayAdapter的构造函数通常包含以下参数:
    Context:上下文对象,用于访问应用程序资源。
    int:用于指定列表项的布局资源 ID。
    T[] 或 List<T>:数据源,可以是数组或列表形式的数据集合。

代码示例
java">List<String> dataList = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
ArrayAdapter<String> adapter = new ArrayAdapter<>(
    this, 
    android.R.layout.simple_list_item_1,
    dataList
);
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(adapter);

 CursorAdapter

感觉就是省略了遍历Cursor对象的步骤,没什么大用,还不如用BaseAdapter实现,二者实现代码量差别不大,而且后者更灵活。所以这里就不介绍CursorAdapter了。

RecyclerView.Adapter

简要

    RecyclerView.Adapter 是用于将数据适配到 RecyclerView中进行展示的适配器类。它是 页面控件RecyclerView的一个重要组成部分,用于管理数据与视图之间的绑定,并帮助实现高级的列表和网格布局效果。相比于传统的 ListView,RecyclerView 提供了更高度的灵活性和定制性。
    RecyclerView.Adapter 是一个抽象类,你需要继承它并实现一系列必要的方法来管理数据与视图的绑定过程。

代码示例
java">// 这个<RecyclerViewAdapter.ViewHolder>指定了以ViewHolder作为泛型类型参数,用于指定ViewHolder的类型
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private List<String> dataList;

    public RecyclerViewAdapter(List<String> dataList) {
        this.dataList = dataList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String data = dataList.get(position);
        holder.textView.setText(data);
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        public ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
        }
    }
}


http://www.niftyadmin.cn/n/5154372.html

相关文章

SpringBoot基础(四)-- starter的使用

目录 引言: 1. starter的认识 2. pom.xml文件使用starter的案例(以SpringMVC技术为例) 3. starter的特点 引言:<

使用Postman工具做接口测试 —— 断言与参数提取

引言 下面我会以登录为例&#xff0c;来讲如何利用postman提取上一个接口返回数据&#xff0c;并且放到当前接口来使用。 接口关联(参数提取) 下面以登录接口为例&#xff0c;讲一下postman如何使用参数提取&#xff0c;可以通过Fiddler工具对系统登录操作进行抓包分析&#…

leetcode经典面试150题---6.旋转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

【Leetcode】【每日一题】【中等】187. 重复的DNA序列 官方题解待更新

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/repeated-dna-sequences/descrip…

项目实战:新增@Controller和@Service@Repository@Autowire四个注解

1、Controller package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface Controller { }2、Service package com.csdn.mymvc.annotation; import java.lang.annotation.*…

11月5日,每日信息差

今天是2023年11月05日&#xff0c;以下是为您准备的18条信息差 第一、第六届进博会上海市交易团“首单”成交&#xff0c;达成3亿美元采购订单。据悉订单内容涉及有机硅产品&#xff0c;其中有一款改性二甲基硅液体&#xff0c;为亚太首发产品 第二、双十一第一波 快递公司转…

OkHttp库爬取百度云视频详细步骤

以下是使用OkHttp库的Kotlin爬虫程序&#xff0c;该爬虫用于爬取百度云的视频。 首先&#xff0c;我们需要导入OkHttp库和Kotlin库。import okhttp3.OkHttpClient和import kotlin.jvm.JVM。 import okhttp3.OkHttpClient import kotlin.jvm.JVM然后&#xff0c;我们需要创建一…

[原创]Cadence17.4,win64系统,构建CIS库

目录 1、背景介绍 2、具体操作流程 3、遇到问题、分析鉴别问题、解决问题 4、借鉴链接并评论 1、背景介绍 CIS库&#xff0c;绘制原理图很方便&#xff0c;但是需要在Cadence软件与数据库之间建立联系&#xff0c;但是一直不成功&#xff0c;花费半天时间才搞明白如何建立关系并…