android开发-Listview中显示不同的视图布局

来源:互联网 发布:ubuntu docker 编辑:程序博客网 时间:2024/05/22 01:38

1.使用场景

  在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。convertViewItem为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形。

2.ListView包含不同Item的布局

  我们需要做这些工作:

  1)重写 getViewTypeCount() – 该方法返回多少个不同的布局

  2)重写 getItemViewType(int) – 根据position返回相应的Item

  3)根据view item的类型,在getView中创建正确的convertView

3.案例

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
import java.util.ArrayList;
   
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
   
public class listViewTest extends Activity {
/** Called when the activity is first created. */
  ListView listView;
  MyAdapter listAdapter;
  ArrayList<String> listString;
   
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    listView = (ListView)this.findViewById(R.id.listview);
    listString = newArrayList<String>();
    for(int i = 0 ; i < 100 ; i++)
    {
      listString.add(Integer.toString(i));
    }
    listAdapter = newMyAdapter(this);
    listView.setAdapter(listAdapter);
  }
   
  class MyAdapter extends BaseAdapter{
    Context mContext;
    LinearLayout linearLayout = null;
    LayoutInflater inflater;
    TextView tex;
    final int VIEW_TYPE = 3;
    final int TYPE_1 = 0;
    final int TYPE_2 = 1;
    final int TYPE_3 = 2;
   
    public MyAdapter(Context context) {
      // TODO Auto-generated constructor stub
      mContext = context;
      inflater = LayoutInflater.from(mContext);
    }
   
    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      returnlistString.size();
    }
   
    //每个convert view都会调用此方法,获得当前所需要的view样式
    @Override
    public int getItemViewType(int position) {
      // TODO Auto-generated method stub
      int p = position%6;
      if(p == 0)
        returnTYPE_1;
      elseif(p < 3)
        returnTYPE_2;
      elseif(p < 6)
        returnTYPE_3;
      else
        returnTYPE_1;
    }
   
    @Override
    public int getViewTypeCount() {
      // TODO Auto-generated method stub
      return3;
    }
   
    @Override
    public Object getItem(int arg0) {
      // TODO Auto-generated method stub
      returnlistString.get(arg0);
    }
   
    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      returnposition;
    }
   
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      viewHolder1 holder1 = null;
      viewHolder2 holder2 = null;
      viewHolder3 holder3 = null;
      int type = getItemViewType(position);
   
      //无convertView,需要new出各个控件
      if(convertView == null)
      { 
        Log.e("convertView = "," NULL");
   
        //按当前所需的样式,确定new的布局
        switch(type)
        {
        caseTYPE_1:
          convertView = inflater.inflate(R.layout.listitem1, parent, false);
          holder1 = newviewHolder1();
          holder1.textView = (TextView)convertView.findViewById(R.id.textview1);
          holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
          Log.e("convertView = ","NULL TYPE_1");
          convertView.setTag(holder1);
          break;
        caseTYPE_2:
          convertView = inflater.inflate(R.layout.listitem2, parent, false);
          holder2 = newviewHolder2();
          holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
          Log.e("convertView = ","NULL TYPE_2");
          convertView.setTag(holder2);
          break;
        caseTYPE_3:
          convertView = inflater.inflate(R.layout.listitem3, parent, false);
          holder3 = newviewHolder3();
          holder3.textView = (TextView)convertView.findViewById(R.id.textview3);
          holder3.imageView = (ImageView)convertView.findViewById(R.id.imageview);
          Log.e("convertView = ","NULL TYPE_3");
          convertView.setTag(holder3);
          break;
        }
      }else{
        //有convertView,按样式,取得不用的布局
        switch(type)
        {
        caseTYPE_1:
          holder1 = (viewHolder1) convertView.getTag();
          Log.e("convertView !!!!!!= ","NULL TYPE_1");
          break;
        caseTYPE_2:
          holder2 = (viewHolder2) convertView.getTag();
          Log.e("convertView !!!!!!= ","NULL TYPE_2");
          break;
        caseTYPE_3:
          holder3 = (viewHolder3) convertView.getTag();
          Log.e("convertView !!!!!!= ","NULL TYPE_3");
          break;
        }
      }
   
    //设置资源
      switch(type)
      {
        caseTYPE_1:
          holder1.textView.setText(Integer.toString(position));
          holder1.checkBox.setChecked(true);
          break;
        caseTYPE_2:
          holder2.textView.setText(Integer.toString(position));
          break;
        caseTYPE_3:
          holder3.textView.setText(Integer.toString(position));
          holder3.imageView.setBackgroundResource(R.drawable.icon);
          break;
      }
   
      returnconvertView;
    }
  }
   
  //各个布局的控件资源
  class viewHolder1{
    CheckBox checkBox;
    TextView textView;
  }
   
  class viewHolder2{
    TextView textView;
  }
   
  class viewHolder3{
    ImageView imageView;
    TextView textView;
  }
}
0 0