Android Studio(适配器Adapter)

认识适配器

在学完并且在做了一个自主项目后,我对适配器有了以下认识:
1. 适配器的作用:
    数据驱动的动态页面列表渲染,所以适配器主要就做了两件事:遍历数据,渲染页面(列表项)。比如我们常见的订单列表,每一项订单项样式是相同的,而订单数据不同。
2. 适配器的参数:
    大部分都是需要我们继承自定义去实现适配器,除非你仅仅用于展示数据不用做任何复杂数据样式和数据交互的列表项。既然是自定义适配器,那么实例化参数就是我们自己定义了,那么适配器参数需要什么呢?
    其一,你在哪个页面使用适配器(这个其实就叫context);
    其二,你要遍历渲染的数据,列表项数据(一般都是List类型)
    其三:渲染的列表项布局,在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, 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)
    数据索引可以获取当前列表项数据,然后可以开始结合数据构建具体的列表项视图。

代码示例
private class MyAdapter extends BaseAdapter{
    private Context context;
    private List goodTitles;
    private LayoutInflater layoutInflater;
    
    public MyAdapter(Context context, List 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
// 优化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> data,
                    int resource,
                    String[] from,
                    int[] to
                    )

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

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


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

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

public class MainActivity extends Activity {

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

        // 准备数据源,这里使用 List> 形式
        List> dataList = new ArrayList<>();
        Map data1 = new HashMap<>();
        data1.put("name", "Alice");
        data1.put("age", 20);
        Map 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:数据源,可以是数组或列表形式的数据集合。

代码示例
List dataList = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
ArrayAdapter 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 是一个抽象类,你需要继承它并实现一系列必要的方法来管理数据与视图的绑定过程。

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

    public RecyclerViewAdapter(List 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);
        }
    }
}

你可能感兴趣的:(Android,Studio开发,android,studio,android,ide,安卓,java)