网站app开发哪家好,门户网站ip地址段,玉林做网站,linux系统上的wordpress认识适配器 在学完并且在做了一个自主项目后#xff0c;我对适配器有了以下认识#xff1a;1. 适配器的作用#xff1a; 数据驱动的动态页面列表渲染#xff0c;所以适配器主要就做了两件事#xff1a;遍历数据#xff0c;渲染页面#xff08;列表项#xff09;。比…认识适配器 在学完并且在做了一个自主项目后我对适配器有了以下认识1. 适配器的作用 数据驱动的动态页面列表渲染所以适配器主要就做了两件事遍历数据渲染页面列表项。比如我们常见的订单列表每一项订单项样式是相同的而订单数据不同。2. 适配器的参数 大部分都是需要我们继承自定义去实现适配器除非你仅仅用于展示数据不用做任何复杂数据样式和数据交互的列表项。既然是自定义适配器那么实例化参数就是我们自己定义了那么适配器参数需要什么呢 其一你在哪个页面使用适配器这个其实就叫context 其二你要遍历渲染的数据列表项数据一般都是ListObject类型 其三渲染的列表项布局在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 直接子类 ArrayAdapterT, 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 ListString goodTitles;private LayoutInflater layoutInflater;public MyAdapter(Context context, ListString goodTitles){this.context context;this.goodTitles goodTitles;this.layoutInflater LayoutInflater.from(context);}Overridepublic int getCount() {return goodTitles.length;}Overridepublic Object getItem(int i) {return goodTitles[i];}Overridepublic long getItemId(int i) {return i;}Overridepublic 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?extends MapString,? 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 {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 准备数据源这里使用 ListMapString, Object 形式ListMapString, Object dataList new ArrayList();MapString, Object data1 new HashMap();data1.put(name, Alice);data1.put(age, 20);MapString, Object data2 new HashMap();data2.put(name, Bob);data2.put(age, 25);dataList.add(data1);dataList.add(data2);// 指定数据对应的 keyString[] from {name, age};// 指定数据展示的视图资源 IDint[] to {R.id.text_name, R.id.text_age};// 创建 SimpleAdapterSimpleAdapter simpleAdapter new SimpleAdapter(this, dataList,R.layout.list_item, from, to);// 获取 ListViewListView listView findViewById(R.id.list_view);listView.setAdapter(simpleAdapter);}
}ArrayAdapter
简要 简述 继承自BaseAdapter可以直接实例化使用该适配器有个重要的特点就是数据源单一意味着ArrayAdapter只能渲染列表项单一的控件。 ArrayAdapter的构造函数通常包含以下参数 Context上下文对象用于访问应用程序资源。 int用于指定列表项的布局资源 ID。 T[] 或 ListT数据源可以是数组或列表形式的数据集合。 代码示例
ListString dataList new ArrayList(Arrays.asList(Apple, Banana, Cherry));
ArrayAdapterString 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的一个重要组成部分用于管理数据与视图之间的绑定并帮助实现高级的列表和网格布局效果。相比于传统的 ListViewRecyclerView 提供了更高度的灵活性和定制性。 RecyclerView.Adapter 是一个抽象类你需要继承它并实现一系列必要的方法来管理数据与视图的绑定过程。 代码示例
// 这个RecyclerViewAdapter.ViewHolder指定了以ViewHolder作为泛型类型参数用于指定ViewHolder的类型
public class RecyclerViewAdapter extends RecyclerView.AdapterRecyclerViewAdapter.ViewHolder {private ListString dataList;public RecyclerViewAdapter(ListString dataList) {this.dataList dataList;}NonNullOverridepublic ViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {View view LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);return new ViewHolder(view);}Overridepublic void onBindViewHolder(NonNull ViewHolder holder, int position) {String data dataList.get(position);holder.textView.setText(data);}Overridepublic 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);}}
}