Android数据适配器Adapter的快速使用(只需要两步)
2017-06-14 10:00
330 查看
什么是数据适配器?
下图展示了数据源、适配器、ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter
如何使用?
使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount(): 适配器中数据集的数据个数;
public Object getItem(int position): 获取数据集中与索引对应的数据项;
public long getItemId(int position): 获取指定行对应的ID;
public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
第一步:创建MyAdapter.java的类。
设置网络图片方法中使用Android图片下载缓存库 Picasso
第二步:在MainActivity中具体使用
最后在onCreate方法中 listview.setAdapter(myAdapter );即可
相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~有了上面的方法就方便多了。
下图展示了数据源、适配器、ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter
如何使用?
使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount(): 适配器中数据集的数据个数;
public Object getItem(int position): 获取数据集中与索引对应的数据项;
public long getItemId(int position): 获取指定行对应的ID;
public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
第一步:创建MyAdapter.java的类。
package com.example.text.Adapter; import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.text.newhd.R; import com.squareup.picasso.Picasso; import java.util.ArrayList; public abstract class MyAdapter<T> extends BaseAdapter { private ArrayList<T> mData; private int mLayoutRes; //布局id public MyAdapter() { } public MyAdapter(ArrayList<T> mData, int mLayoutRes) { this.mData = mData; this.mLayoutRes = mLayoutRes; } @Override public int getCount() { return mData != null ? mData.size() : 0; } @Override public T getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes , position); bindView(holder, getItem(position)); return holder.getItemView(); } public abstract void bindView(ViewHolder holder, T obj); //添加一个元素 public void add(T data) { if (mData == null) { mData = new ArrayList<>(); } mData.add(data); notifyDataSetChanged(); } //往特定位置,添加一个元素 public void add(int position, T data) { if (mData == null) { mData = new ArrayList<>(); } mData.add(position, data); notifyDataSetChanged(); } public void remove(T data) { if (mData != null) { mData.remove(data); } notifyDataSetChanged(); } public void remove(int position) { if (mData != null) { mData.remove(position); } notifyDataSetChanged(); } public void clear() { if (mData != null) { mData.clear(); } notifyDataSetChanged(); } public static class ViewHolder { private SparseArray<View> mViews; //存储ListView 的 item中的View private View item; //存放convertView private int position; //游标 private Context context; //Context上下文 //构造方法,完成相关初始化 private ViewHolder(Context context, ViewGroup parent, int layoutRes) { mViews = new SparseArray<>(); this.context = context; View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false); convertView.setTag(this); item = convertView; } //绑定ViewHolder与item public static ViewHolder bind(Cont 4000 ext context, View convertView, ViewGroup parent, int layoutRes, int position) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(context, parent, layoutRes); } else { holder = (ViewHolder) convertView.getTag(); holder.item = convertView; } holder.position = position; return holder; } @SuppressWarnings("unchecked") public <T extends View> T getView(int id) { T t = (T) mViews.get(id); if (t == null) { t = (T) item.findViewById(id); mViews.put(id, t); } return t; } /** * 获取当前条目 */ public View getItemView() { return item; } /** * 获取条目位置 */ public int getItemPosition() { return position; } /** * 设置文字 */ public ViewHolder setText(int id, CharSequence text) { View view = getView(id); if (view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 设置图片 */ public ViewHolder setImageResource(int id, int drawableRes) { View view = getView(id); if (view instanceof ImageView) { ((ImageView) view).setImageResource(drawableRes); } else { view.setBackgroundResource(drawableRes); } return this; } /** * 设置网络图片 */ public ViewHolder setNetImageResource(int id, String imagePath) { View view = getView(id); if (view instanceof ImageView) { Picasso.with(context).load(imagePath) .error(R.drawable.inagerro).into((ImageView) view); } else { Picasso.with(context).load(imagePath) .error(R.drawable.inagerro).into((ImageView) view); } return this; } /** * 设置点击监听 */ public ViewHolder setOnClickListener(int id, View.OnClickListener listener) { getView(id).setOnClickListener(listener); return this; } /** * 设置可见 */ public ViewHolder setVisibility(int id, int visible) { getView(id).setVisibility(visible); return this; } /** * 设置标签 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } } }
设置网络图片方法中使用Android图片下载缓存库 Picasso
//R.drawable.inagerro加载失败显示的图片 Picasso.with(context).load(imagePath) .error(R.drawable.inagerro).into((ImageView) view);
第二步:在MainActivity中具体使用
MyAdapter<OpenCursorBean_Campaign> myAdapter = new MyAdapter<OpenCursorBean_Campaign>((ArrayList<OpenCursorBean_Campaign>) list, R.layout.adapter_campaign) { @Override public void bindView(ViewHolder holder, OpenCursorBean_Campaign obj) { holder.setText(R.id.index, (holder.getItemPosition() + 1) + "."); holder.setText(R.id.hospitalName, obj.getAPPR_TITLE()); holder.setText(R.id.code, "编号:" + obj.getREPORT_CODE() + " 图片:" + obj.getPHOTO_COUNT()); holder.setText(R.id.status, obj.getSTATUS()); } };
最后在onCreate方法中 listview.setAdapter(myAdapter );即可
相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~有了上面的方法就方便多了。
相关文章推荐
- Android数据适配器(Adapter)优化:使用高效的ViewHolder
- Android数据适配器(Adapter)优化:使用高效的ViewHolder
- android 适配器Adpter的使用总结 之 BaseExpandableListAdapter
- Android中Spinner下拉列表(使用自定义Adapter实现,显示数据取自联系人数据库)
- Android -- listview的使用, Inflater打气筒创建View对象,三种数据Adapter
- Android listview与adapter用法(包括自定义需要的适配器)
- Android:ViewPager适配器PagerAdapter的使用
- android 适配器Adpter的使用总结 之 BaseExpandableListAdapter
- [置顶] Android_ListView_Adapter使用和数据动态加载
- 【Android Developers Training】 92. 序言:使用同步适配器传输数据
- Android_ListView_Adapter使用和数据动态加载
- android之ListView中使用的适配器CursorAdapter
- android学习二:适配器Adapter的使用
- Android适配器Adapter的使用
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android中ListView同过自定义布局并使用SimpleAdapter的方式实现数据的绑定
- Android BaseAdapter基本使用及数据刷新
- Android中GridView的使用——使用自带的SimpleAdapter(简单适配器)
- [Android]使用AdapterTypeRender对不同类型的item数据到UI的渲染
- Android中ListView,Gallery,GridView 的适配器Adapter的使用