笔记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在内存中:
    Recycler工作原理
    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征途

原创粉丝点击