前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记42 | Android加载器Adapter的深入学习篇(一)

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

作者头像
项勇
发布2018-06-19 15:33:34
5860
发布2018-06-19 15:33:34
举报
文章被收录于专栏:项勇

地址

CSDN:http://blog.csdn.net/xiangyong_1521/article/details/78653538简书:http://www.jianshu.com/p/7bfd1eeea5cb


目录

  • 以ListView为例的工作原理
  • ViewHolder的作用
  • getItemViewType和getViewTypeCount
  • 实现
  • 实现步骤

1.ListView针对List中每个item, adapter都会调用一个getView的方法获得布局视图 2.我们一般会Inflate一个新的View,填充数据并返回显示

如果我们的Item很多话,Android中有个叫做Recycler的构件,无论数据中是多少个item,在显示上Recycler只存储其中可见的View在内存中:

Adapter中常见的getView方法的调用:

代码语言:javascript
复制
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了

代码语言:javascript
复制
class ViewHolder_a{
        TextView textView;
        ImageView imageView;
        Button button;
    }

这才得出一个刚到及格线的getView:

代码语言:javascript
复制
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这两个BaseAdapter内部方法。

代码语言:javascript
复制
//返回由getView创建的视图类型的数量。每种类型都表示可以在getView中转换的一组视图。
@Override
        public int getViewTypeCount() {
            return super.getViewTypeCount();
        }

代码语言:javascript
复制
//获取将由getView为指定项目创建的视图类型。
@Override
        public int getItemViewType(int position) {
            return position;

实现

Main:

代码语言:javascript
复制
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开始,依次递增。
代码语言:javascript
复制
@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可以进行判断
代码语言:javascript
复制
switch (getItemViewType(position)) {
            ...
}
  • 定义ViewHolder,根据类型的不同需要定义多个ViewHolder1,2,3,加载对应的布局和数据
  • 添加好数据后,listview.setAdapter就行了!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 地址
  • 目录
  • ViewHolder的作用
  • getItemViewType和getViewTypeCount
  • 实现
  • 实现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档