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

地址

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方法的调用:

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这两个BaseAdapter内部方法。

//返回由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就行了!

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

Android中的AutoCompleteTextView的使用

最终的效果如下: ? main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm...

2658
来自专栏林冠宏的技术文章

android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。

转载请声明出处(https://cloud.tencent.com/developer/user/1148436/activities) 先上张效果图: ? 1...

2125
来自专栏Micro_awake web

原生js实现图片轮播效果

思路:设置父容器(一定宽度,一定高度,相对定位,子容器超出部分进行隐藏),子容器图片并排(浮动,绝对定位,每次点击进行相应的左或右偏移量) 1.html: ...

2116
来自专栏pangguoming

android AutoCompleteTextView 自定义BaseAdapter

最近项目中需要做搜索功能,实现类似 Google、Baidu 搜索的 下拉提示效果。Android为我们提供了 AutoCompleteTextView 控件来...

3026
来自专栏Android开发指南

9.代码抽取(adapter)

2569
来自专栏葡萄城控件技术团队

HTML5 & CSS3初学者指南(4) – Canvas使用

介绍 传统的HTML主要用于文本的创建,可以通过<img>标签插入图像,动画的实现则需要第三方插件。在这方面,传统的HTML极其缺乏满足现代网页多媒体需求的能力...

1846
来自专栏Hongten

android开发_Intent初级学习

前面说到用Intent来拨打电话和发送短信,主要是介绍了Intent的一些简单方法,这里Intent启动了另一个Activity,在之前的内容都是在一个Acti...

582
来自专栏mukekeheart的iOS之旅

onclicklistener到底怎么用?

相信很多像我一样的新手学习Android开发会遇到这个问题,通过这几天的归类和总结,将我的理解写在下面,欢迎大家一起前来讨论: 以按钮BUTTON的监听事件为例...

2466
来自专栏前端知识分享

第43天:事件对象event

一、事件对象 事件:onmouseover、 onmouseout、 onclick event //事件的对象

861
来自专栏vue学习

简单的Canvas

ps:上面画内圆时用的moveTo()方法,其实就是“提笔”,首先用“笔”画了个外圆,然后将笔提起来,放到内圆的一点上,然后再画。

753

扫码关注云+社区