笔记42 | Android加载器Adapter的深入学习篇

地址

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征途

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值