Android BaseAdapter

http://www.eoeandroid.com/blog-645820-40459.html

需求: ListView中多种类型结构,例如:

  1. ListView 中某条不可点击,点击没有触发事件,没有触发效果。
  2. 聊天结构,左面一条消息,右面几条消息或图文混排:文字、文字加图片或单独的图片。

这就用到了 BaseAdapter 的几个方法。

第一点

BaseAdapter 为我们提供了一个方法来判断当前的条目处于有效的状态 BaseAdapter#isEnabled(int),使用的时候只需要重写 BaseAdapter的这个方法, 如果想要所有的条目都不可以点击,直接返回 false, 如果想要某个位置可以点击返回true 即可,默认返回 true

应用场景: 一些物品的详细介绍,曾今的我也在为一些我不想 ListView 中的某个条目不可点击或触发点击效果而苦恼,直到我发现这个方法。

第二点

这个是今天最重要的一点,也是我们经常用的,也是 BaseAdapter 提供的两个方法BaseAdapter#getViewTypeCount() 返回当前 Adapter中 list item 种类的总数,默认为 1 和 BaseAdapter#getItemViewType(int) 返回当前位置 View 类型,默认为 0

note: ViewTypeCount 从 1 开始, ItemViewType 从 0 开始。

下面提供我自己重写的 Adapter

1
2
3
4
5
6
7
public interface MultiTypeViewTypeListener {
    /**
     * 
     * @return
     */
    public int getType();
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public abstract class MultiTypeFactoryAdapter<E extends MultiTypeViewTypeListener> extends BaseAdapter {

    protected List<E> items ;
    protected final LayoutInflater inflater;

    public MultiTypeFactoryAdapter(Context context){
        this(context, new ArrayList<E>());
    }

    public MultiTypeFactoryAdapter(Context context,List<E> items){
        inflater = LayoutInflater.from(context);
        this.items = items;
    }

    public void add(E item){
        if(item == null)return;
        items.add(item);
        notifyDataSetChanged();
    }

    public void add(E[] arrays){
        if(arrays == null || arrays.length <= 0)return;
        for(int i = 0, lenght = arrays.length; i < lenght; i++){
            items.add(arrays[i]);
        }
        notifyDataSetChanged();
    }

    public void addAll(Collection<? extends E> items){
        if(items == null)return;
        this.items.addAll(items);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return items == null ? 0 : items.size();
    }

    @Override
    public E getItem(int position) {
        return items.get(position);
    }

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

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

    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MultiTypeViewHolderFactory<E> holder = null;
        final int type = getItemViewType(position);
        if(convertView == null){
            convertView = inflater.inflate(getChildLayoutId(type), parent, false);
            holder = createViewHolder(convertView, type);
            convertView.setTag(holder);
        }else{
            holder = (MultiTypeViewHolderFactory<E>) convertView.getTag();
        }
        holder.init(getItem(position), position , this);
        return convertView;
    }
    /**
     * get type view count
     */
    @Override
    public abstract int getViewTypeCount();
    /**
     * get layout id for type
     * @param type
     * @return layout id
     */
    protected abstract int getChildLayoutId(int type);
    /**
     * get ViewHolder for type
     * @param view
     * @param type
     * @return
     */
    protected abstract MultiTypeViewHolderFactory<E> createViewHolder(View view, int type);
    /**
     * 
     *
     */
     public static interface MultiTypeViewHolderFactory<E>{

         public void init(final E item, final int position, final MultiTypeFactoryAdapter<?> adapter);
     }

}

一点应用的代码片段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class DetailAdapter extends MultiTypeFactoryAdapter<DetailModel> {

    public DetailAdapter(Context context, List<DetailModel> items) {
        super(context, items);
    }

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

    @Override
    public boolean isEnabled(int position) {
        return false;
    }
    @Override
    protected int getChildLayoutId(int type) {
        switch (type) {
        case 0:// title
            return R.layout.list_item_detial_title;
        case 1:// content
        default:
            return R.layout.list_item_detial_content;
        }
    }
//...
//省略ViewHolder 这个应该是没用的东西   


    @Override
    protected MultiTypeFactoryAdapter.MultiTypeViewHolderFactory<DetailModel> createViewHolder(
            View view, int type) {
        switch (type) {
        case 0:
            return new TitleViewHolder(view);
        case 1:
        default:
            return new ContentViewHolder(view);
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值