Adapter的getViewTypeCount和getItemViewType

Adapter的getViewTypeCount和getItemViewType

不同的项目布局(item layout)

我们再举一个稍微复杂的例子,在上例的list中加入一些分隔线

你需要做这些:

  1. 重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局
  2. 重写 getItemViewType(int) – 由position返回view type id
  3. 根据view item的类型,在getView中创建正确的convertView

以下是代码:

public class MultipleItemsList extends ListActivity {

    private MyCustomAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new MyCustomAdapter();
        for (int i = 1; i < 50; i++) {
            mAdapter.addItem("item " + i);
            if (i % 4 == 0) {
                mAdapter.addSeparatorItem("separator " + i);
            }
        }
        setListAdapter(mAdapter);
    }

    private class MyCustomAdapter extends BaseAdapter {

        private static final int TYPE_ITEM = 0;
        private static final int TYPE_SEPARATOR = 1;
        private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;

        private ArrayList mData = new ArrayList();
        private LayoutInflater mInflater;

        private TreeSet mSeparatorsSet = new TreeSet();

        public MyCustomAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public void addItem(final String item) {
            mData.add(item);
            notifyDataSetChanged();
        }

        public void addSeparatorItem(final String item) {
            mData.add(item);
            // save separator position
            mSeparatorsSet.add(mData.size() - 1);
            notifyDataSetChanged();
        }

        @Override
        public int getItemViewType(int position) {
            return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
        }

        @Override
        public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }

        @Override
        public int getCount() {
            return mData.size();
        }

        @Override
        public String getItem(int position) {
            return mData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = getItemViewType(position);
            System.out.println("getView " + position + " " + convertView + " type = " + type);
            if (convertView == null) {
                holder = new ViewHolder();
                switch (type) {
                    case TYPE_ITEM:
                        convertView = mInflater.inflate(R.layout.item1, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.text);
                        break;
                    case TYPE_SEPARATOR:
                        convertView = mInflater.inflate(R.layout.item2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }

    }

    public static class ViewHolder {
        public TextView textView;
    }
}

运行程序,你会看到每4个item一个分割线:

时间: 2024-08-04 12:14:20

Adapter的getViewTypeCount和getItemViewType的相关文章

ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException

  ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayIndexOutOfBoundsException: (数组越界)   搜了原因,居然是getItemViewType这里里面返回的Type必须是从0开始的,如果getviewtypecount等于2,那么getItemViewType返回的数值是从0~1的常数.简单说,在刚开始设置type常量时,是从

ListView回收机制相关分析

ListView回收机制相关分析  最初的分析文档为word,该文档是直接从word文档发布,布局未做详细调整,凑合看吧.   所用源码版本为最新的Android 4.4.2(API 19).更新中--   ListView回收机制相关分析    1 1.    ListView结构关系    1 2.    RecycleBin类解析    3 2.1 RecycleBin变量    4 2.2 RecycleBin方法    4 3.    RecycleBin的调用和关键方法    7 3

Android ListView展示不同的布局

由于item中converView的复用,所以ListView在展示不同布局的时候,需要在adapter里复写以下方法:getViewTypeCount()和getItemViewType(int position).有了这个思路就很简单了.adapter代码如下: package com.example.dyk.listviewtest; import android.content.Context; import android.view.LayoutInflater; import and

Android为ListView的Item设置不同的布局

  MainActivity如下: package cc.testlistview; import java.util.ArrayList; import java.util.HashMap; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import andr

通信录列表+复杂Adapter分析

概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些技术点做下总结. 清晰的结构 SideLetterBar实现城市列表 如何显示字母浮窗 复杂的Adapter ScrollView中嵌入ListView,GridView冲突的解决 清晰的结构 一般看到一个项目之前我会先看下他的结构规划,学习一下高手们架构上的意识,下面是目录结构 从这里清晰的看出M

人人都会设计模式:04-适配器模式--Adapter

版权声明:本文为博主原创文章,未经博主允许不得转载 公众号:TigerChain 添加公号更多文章等着你 作者: TigerChain 教程简介 1.阅读对象 本篇教程适合新手阅读,老手直接略过 2.教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 正文 一.什么是适配器模式 1.生活中的适配器 比如电脑转接器「这里主要是指连接电脑和投影仪的」,以我的 MAC 电脑为例子,我们公司的投影支持 VGA 和 HDMI ,但是我的 MAC 电脑只有一个 MINI DP 接

ListView中getView中放置多个item和getItemViewType的用法

istView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter "给我一个视图" (getView). 一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能! 实际上Android为你缓存了视图. Android中有个叫做Recycler的构件,下图是他的工作原理: 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中. ListView先请

安卓-adapter无法绑定数据,get(poiniton)无法获取到数据

问题描述 adapter无法绑定数据,get(poiniton)无法获取到数据 要实现一个像通讯录一样的listview public class MyDistributor2Activity extends BaseActivity { @InjectView(R.id.my_distributor_lv) PinnedHeaderNoScrollListViewTest distributor_lv; LayoutInflater layoutInflater; MyDistributor2

listview中的adapter学习小结

概述 Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,Android给我们提拱了4个adapte供我们使用: BaseAdapter是一个抽象类,继承它需要实现较多的方法 ArrayAdapter支持泛型操作,最为简单,只能展示一行字 SimpleAdapter有最好的扩充性,可以自定义出各种效果 SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来.如需要实现更复杂的UI也