ListView剖析 - item加载不同布局

作者: a57ecf3aaaf2 | 来源:发表于2016-05-29 15:57 被阅读1729次

前言

Android中的ListView,大家可能已经很熟悉了,用起来也算是得心应手。可能你见过一个ListView中展示了不同的布局,或许你会说,这种方式实现起来很简单,在item的布局文件中通过visibility来动态显示、隐藏view,即可实现这种效果。

即使是我的同事,让他实现这样的不同布局,依然采用的是以上方式,完全不知道BaseAdapter已经为我们提供了多种不同布局的item的实现方式。

声明一个继承BaseAdapter的Adapter

在子adapter中重写父类的getViewTypeCountgetItemViewType方法,顾名思义:

  • getViewTypeCount表示不同的item布局类型的数量
  • getItemViewType表示不同布局的item的类型
class TypeAdapter extends BaseAdapter {

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

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getType();
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            switch (getItemViewType(position)) {
                case 0:
                    convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.type1, null);
                    break;

                case 1:
                    convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.type2, null);
                    break;
            }
            holder = new ViewHolder();
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }
}

这样就可以在getView方法中通过不同的view type,来inflate不同的item布局,后面对不同item的数据填充,都可以利用getItemViewType进行分别设置。

效果

最终实现的效果如下:

最终效果

相关文章

网友评论

  • 3de330007792:其实安卓原生控件中,和适配器相关的控件都可以设置不同的item
  • a79bc99bf5e1:不错啊,好技巧,之前都是用if来判断position的值来切换不同的view
  • PANWCS:根据ViewType的数量不同去设置多个holder,还有别的更好的解决办法吗?
    Nearby杨:@PANWCS 不设置多个holder,不同布局的控件都放在一起,按照不同的viewtype进行使用,区分开使用就好了,就不会存在空引用
  • ae14e5518257:这样使用view缓存的时候有可能会拿到其他类型的view的缓存吧?使用的时候有可能会报空指针的吧
    ae14e5518257:@Joky_sss 我现在想的的方法就是在view上再额外设置个tag表明这个view的类型,这样有机会可以复用一下,不然基本每次都要重新创建
    ae14e5518257:@Fynn_ 你这么说我就不去实验了,那岂不是缓存基本没用了,我本来想重构下adapter,最近找了些资料都是你像你这样写的,但是空指针我是碰到过的,所以也是惆怅
    a57ecf3aaaf2:@Joky_sss 对的,这只是一个例子,具体还需要去处理其他情况。

本文标题:ListView剖析 - item加载不同布局

本文链接:https://www.haomeiwen.com/subject/nndqdttx.html