在学完并且在做了一个自主项目后,我对适配器有了以下认识:
1. 适配器的作用:
数据驱动的动态页面列表渲染,所以适配器主要就做了两件事:遍历数据,渲染页面(列表项)。比如我们常见的订单列表,每一项订单项样式是相同的,而订单数据不同。
2. 适配器的参数:
大部分都是需要我们继承自定义去实现适配器,除非你仅仅用于展示数据不用做任何复杂数据样式和数据交互的列表项。既然是自定义适配器,那么实例化参数就是我们自己定义了,那么适配器参数需要什么呢?
其一,你在哪个页面使用适配器(这个其实就叫context);
其二,你要遍历渲染的数据,列表项数据(一般都是List
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的原因主要是避免列表项视图的重复构建
@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);
}
}
继承自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
简述:
继承自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);
感觉就是省略了遍历Cursor对象的步骤,没什么大用,还不如用BaseAdapter实现,二者实现代码量差别不大,而且后者更灵活。所以这里就不介绍CursorAdapter了。
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);
}
}
}