笔记42 | Android加载器Adapter的深入学习篇
来源:互联网 发布:js插件的写法 编辑:程序博客网 时间:2024/06/05 14:56
地址
http://www.jianshu.com/p/7bfd1eeea5cb
目录
- 以ListView为例的工作原理
- ViewHolder的作用
- getItemViewType和getViewTypeCount
- 实现
- 实现步骤
- ListView针对List中每个item, adapter都会调用一个getView的方法获得布局视图
我们一般会Inflate一个新的View,填充数据并返回显示
如果我们的Item很多话,Android中有个叫做Recycler的构件,无论数据中是多少个item,在显示上Recycler只存储其中可见的View在内存中:
Adapter中常见的getView方法的调用:
public View getView(int position, View convertView, ViewGroupparent){ if (convertView ==null) { convertView =LayoutInflater.from(mContext).inflate(R.layout.item_view, null); } //dosomething… return converView; }
ViewHolder的作用
Recycler模式是为了解决重复inflate时候造成的View资源浪费,ViewHolder则是进一步进行性能优化,我们拿到convertView的时候,每次都会根据这个布局去findViewById,如果没加载一次的话,还是很吃力,所以就有ViewHolder的概念:
使用一个静态类,保存xml中的各个子View的引用关系,这样就不必要每次都去解析xml了
class ViewHolder_a{ TextView textView; ImageView imageView; Button button; }
这才得出一个刚到及格线的getView:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_view, null); holder = new ViewHolder(); holder.titleTextView = (TextView) convertView.findViewById(R.id.text); holder.iconImageView = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.titleTextView.setText(DATA[pos].title); holder.iconImageView.setImageBitmap(DATA[pos].bitmap); return convertView; } static class ViewHolder { TextView titleTextView; ImageView iconImageView; }
getItemViewType和getViewTypeCount
前一篇中实现了各种样式的Adapter,从简单的单字符类型,到多字符类型,再到有button的类型,当一个listview需要加载各种不同的item时,就需要getItemViewType和getViewTypeCount这两个adapter内部方法。
//返回由getView创建的视图类型的数量。每种类型都表示可以在getView中转换的一组视图。@Override public int getViewTypeCount() { return super.getViewTypeCount(); }
和
//获取将由getView为指定项目创建的视图类型。@Override public int getItemViewType(int position) { return position;
实现
Main:
public class FrameLyout4 extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment4, container , false); mDate = getDate(); initView(view); return view; } public List<Map<String, Object>> getDate(){ List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("tv", "京东"); //0 map.put("im", R.drawable.jingdong); list.add(map); map = new HashMap<String, Object>(); //1 map.put("title", "摩托罗拉"); map.put("jia", "价格:2000"); map.put("img", R.drawable.moto); list.add(map); map = new HashMap<String, Object>();//2 map.put("ti", "丰田"); list.add(map); map = new HashMap<String, Object>();//3 map.put("tv", "阿里"); map.put("im", R.drawable.ali); list.add(map); map = new HashMap<String, Object>();//4 map.put("title", "诺基亚"); map.put("jia", "价格:3000"); map.put("img", R.drawable.nuojiya); list.add(map); map = new HashMap<String, Object>();//5 map.put("ti", "本田"); list.add(map); map = new HashMap<String, Object>();//6 map.put("tv", "腾讯"); map.put("im", R.drawable.tx); list.add(map); map = new HashMap<String, Object>();//7 map.put("title", "三星"); map.put("jia", "价格:4000"); map.put("img", R.drawable.sanxing); list.add(map); map = new HashMap<String, Object>();//8 map.put("ti", "马自达"); list.add(map); map = new HashMap<String, Object>();//9 map.put("tv", "百度"); map.put("im", R.drawable.baidu); list.add(map); return list; } ListView listView; private void initView(View view) { listView=(ListView) view.findViewById(R.id.list4); listView.setAdapter(new MyAdapter()); } List<Map<String, Object>> mDate; public class MyAdapter extends BaseAdapter{ @Override public int getViewTypeCount() {//返回Item的类型总数 return super.getViewTypeCount(); } @Override public int getItemViewType(int position) { if (position==0 || position == 3|| position == 9|| position == 6) { return 0; }else if (position==1 || position == 4|| position == 7) { return 1; }else{ return 2; } } @Override public int getCount() { return mDate.size(); } @Override public Object getItem(int position) { return mDate.get(position); } @Override public long getItemId(int position) { return position; } ViewHolder_a holder1; ViewHolder_b holder2; ViewHolder_c holder3; @Override public View getView(final int position, View convertView, ViewGroup parent) { switch (getItemViewType(position)) { case 0: holder1 = new ViewHolder_a(); if (convertView==null) { convertView = View.inflate(getActivity(),R.layout.list_item2, null); holder1.imageView = (ImageView) convertView.findViewById(R.id.item_im3); holder1.textView = (TextView) convertView.findViewById(R.id.item_tv3); holder1.button = (Button) convertView.findViewById(R.id.itm_bt3); convertView.setTag(holder1); }else{ holder1=(ViewHolder_a) convertView.getTag(); } Log.i("md", "mDate():"+mDate); holder1.imageView.setBackgroundResource((Integer) mDate.get(position).get("im")); holder1.textView.setText((String) mDate.get(position).get("tv")); holder1.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); break; case 1: holder2 = new ViewHolder_b(); if (convertView==null) { convertView = View.inflate(getActivity(), R.layout.list_item, null); holder2.imageView = (ImageView) convertView.findViewById(R.id.item_im); holder2.textView = (TextView) convertView.findViewById(R.id.item_tv); holder2.textView2 = (TextView) convertView.findViewById(R.id.item_tv2); convertView.setTag(holder2); }else{ holder2=(ViewHolder_b) convertView.getTag(); } holder2.imageView.setBackgroundResource((Integer) mDate.get(position).get("img")); holder2.textView.setText((String) mDate.get(position).get("title")); holder2.textView2.setText((String) mDate.get(position).get("jia")); break; case 2: holder3 = new ViewHolder_c(); if (convertView == null) { convertView = View.inflate(getActivity(), R.layout.list_item3, null); holder3.imageView1 = (ImageView)convertView.findViewById(R.id.item3_im1); holder3.imageView2 = (ImageView)convertView.findViewById(R.id.item3_im2); holder3.textView = (TextView)convertView.findViewById(R.id.item3_tv); convertView.setTag(holder3); }else{ holder3 = (ViewHolder_c) convertView.getTag(); } holder3.textView.setText((String)mDate.get(position).get("ti")); holder3.imageView1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); holder3.imageView2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); break; } return convertView; } } class ViewHolder_a{ TextView textView; ImageView imageView; Button button; } class ViewHolder_b{ TextView textView; TextView textView2; ImageView imageView; } class ViewHolder_c{ TextView textView; ImageView imageView1; ImageView imageView2; }}
实现步骤
- 首先我们需要为不同的Item设置不同的数值,int值,因为getItemViewType返回的是int值,所以需定义成int,必须从0开始,依次递增。
@Override public int getItemViewType(int position) { if (position==0 || position == 3|| position == 9|| position == 6) { return 0; }else if (position==1 || position == 4|| position == 7) { return 1; }else{ return 2; } }
- 重写getItemViewType和getViewTypeCount方法后,getViewTypeCount返回Item的则为我们定义的position,然后在getView可以进行判断
switch (getItemViewType(position)) { ...}
- 定义ViewHolder,根据类型的不同需要定义多个ViewHolder1,2,3,加载对应的布局和数据
- 添加好数据后,listview.setAdapter就行了!
我的Android征途
阅读全文
1 0
- 笔记42 | Android加载器Adapter的深入学习篇
- 笔记43 | Android加载器Adapter的深入学习篇(二)
- 笔记41 | Android加载器Adapter的几个练习
- Android学习笔记 - Adapter
- Android学习笔记--自定义Adapter的使用
- android学习笔记 Listview adapter
- Android学习笔记之Adapter
- android adapter的学习
- (疯狂的Android 学习笔记)Adapter总结
- Android 适配器Adapter的学习
- Android 适配器Adapter的学习
- Android中Adapter的学习
- 精通Android学习笔记-AdapterView和Adapter
- 【Android学习笔记】Adapter - ArrayAdapter、SimpleAdapter
- Android学习笔记(22):AdapterView与Adapter
- Android学习笔记--adapter.notifyDataSetChanged()延迟执行
- Android的webview加载的学习笔记
- 学习笔记 Tianmao 篇 RecyclerView.Adapter 的封装
- 轻松理解 Android Binder,只需要读这一篇
- 完美解决listView滚动条隐藏的问题!
- 第四章:数据检索
- JDK工具查看内存中活跃对象数量
- myeclipse连接mysql数据库详细步骤
- 笔记42 | Android加载器Adapter的深入学习篇
- 通过Spring Session实现新一代的Session管理
- VC++串口通信编程详解
- anaconda闪退(spyder打不开)
- 输入输出系统(三)
- Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
- 模板函数
- 51nod 1625 夹克爷发红包(DFS+贪心)代码详解
- HEXO个人博客实现域名访问