Android 万能适配器
来源:互联网 发布:闪电分期go淘宝商铺 编辑:程序博客网 时间:2024/05/17 06:26
传统写法:
一个ListView对应一个Adapter对应一个ViewHolder。
MyAdapter
public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<Bean> mdatas = new ArrayList<>(); MyAdapter(Context context, List<Bean> mDatas) { mInflater = LayoutInflater.from(context); this.mdatas = mdatas; } @Override public int getCount() { return mdatas.size(); } @Override public Object getItem(int position) { return mdatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_listview, parent, false); holder = new ViewHolder(); holder.mTitle = (TextView) convertView.findViewById(R.id.id_title); holder.mDesc = (TextView) convertView.findViewById(R.id.id_desc); holder.mTime = (TextView) convertView.findViewById(R.id.id_time); holder.mPhone = (TextView) convertView.findViewById(R.id.id_phone); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Bean bean = mdatas.get(position); holder.mTitle.setText(bean.getTitle()); holder.mDesc.setText(bean.getDesc()); holder.mTime.setText(bean.getTime()); holder.mPhone.setText(bean.getPhone()); return convertView; } private class ViewHolder { TextView mTitle; TextView mDesc; TextView mTime; TextView mPhone; }}MainActivity
public class MainActivity extends Activity { private ListView mListView; private List<Bean> mDatas; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_commonadapter); initDatas(); initView(); } private void initView() { mListView = (ListView) findViewById(R.id.id_listview); mListView.setAdapter(mAdapter); } private void initDatas() { mDatas = new ArrayList<Bean>(); Bean bean = new Bean("Android新技能Get 1", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 2", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 3", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 4", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 5", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 6", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 7", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 8", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); bean = new Bean("Android新技能Get 9", "打造万能的ListView和GridView适配器", "2016-11-06", "10086"); mDatas.add(bean); mAdapter = new MyAdapter(this, mDatas); }}
但是如果项目中有许多的ListView,就需要些很多的adapter和viewholder。
共通ViewHolder:
public class ViewHolder { // 比map更有效率,key固定为Integer private SparseArray<View> mViews; private int mPosition; private View mConvertView; public ViewHolder(Context mContext, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<>(); this.mConvertView = LayoutInflater.from(mContext).inflate(layoutId, parent, false); this.mConvertView.setTag(this); } public static ViewHolder get(Context mContext, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(mContext, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 通过ViewId获取控件 * * @param viewId * @param <T> * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public View getConvertView() { return mConvertView; } public ViewHolder setText(int viewId, String context) { TextView tv = getView(viewId); tv.setText(context); return this; } public ViewHolder setImageResource(int viewId, int resId) { ImageView tv = getView(viewId); tv.setImageResource(resId); return this; } public int getPosition() { return mPosition; }}
而当前的布局中所有的控件,都可以通过getView获取,如果是第一次调用会往view里面加数据,如果不是第一次,就可以直接从views里面直接读取view。
共通的Adapter:
Adapter中有很多代码是可以提取出来的,例如getItem()getCount()等等。
public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mDatas; protected LayoutInflater mInflater; protected int layoutId; public CommonAdapter(Context mContext, List<T> mDatas, int layoutId) { this.mContext = mContext; this.mDatas = mDatas; this.mInflater = LayoutInflater.from(mContext); this.layoutId = layoutId; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent, layoutId, position); convert(viewHolder, getItem(position)); return viewHolder.getConvertView(); } public abstract void convert(ViewHolder viewHolder, T t);}
自定义adapter:
public class MyAdapterWithCommonViewHolder extends CommonAdapter<Bean> { public MyAdapterWithCommonViewHolder(Context mContext, List<Bean> mDatas) { super(mContext, mDatas, R.layout.item_listview); } @Override public void convert(final ViewHolder viewHolder, final Bean bean) { viewHolder.setText(R.id.id_title, bean.getTitle()) .setText(R.id.id_desc, bean.getDesc()) .setText(R.id.id_time, bean.getTime()) .setText(R.id.id_phone, bean.getPhone()); }}
这样代码就会变得非常的简洁,如果列表中有出了textview以外的空间,也可以去共通的ViewHolder类中添加对应的方法。
0 0
- Android 万能适配器
- Android-打造万能适配器
- Android万能适配器
- Android中万能适配器
- Android 万能适配器
- Android--ListView--万能适配器
- Android 万能适配器
- Android 打造万能适配器
- Android万能适配器
- android打造万能适配器
- Android 万能适配器
- Android Dialog万能适配器
- Android万能适配器基类
- android万能适配器之SuperAdapter
- Android打造ListView万能适配器
- android:打造万能通用适配器
- Android之listview万能适配器
- android万能的Listview适配器
- 打包ZIP
- TCP/IP三次握手的详细过程
- MFC picture控件加载透明png图片
- ue4中动画通知的几种方式
- Codeforces_488C:Fight_the_Monster(暴力)
- Android 万能适配器
- 数组
- Disruptor
- 【设计模式】—-(抽象工厂模式和工厂方法模式区别)
- PAT乙级1058
- 插入排序
- 删除文件夹内的文件
- 唐山卓辰科服
- 设备树学习之(七)I2C设备的注册过程分析