W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本節(jié)是ListView這個小節(jié)的最后一節(jié),給大家?guī)淼氖荓istView多布局Item的實現(xiàn), 何為ListView Item多布局,打個比方,QQ這種聊天列表:
假如他是用一個ListView做的,那么一個ListView上不就有兩種不同的Item咯! 一左一右,嘿嘿,本節(jié)就來教大家如何實現(xiàn)ListView的多布局!
重寫getItemViewType()方法對應View是哪個類別,以及getViewTypeCount()方法iew返回 總共多少個類別!然后再getView那里調(diào)用getItemViewType獲得對應類別,再加載對應的View!
這里的話直接用上一節(jié)的兩個布局,然后另外寫一個Adapter重寫要點中的幾個幾個地方:
MutiLayoutAdapter.java:
/**
* Created by Jay on 2015/9/23 0023.
*/
public class MutiLayoutAdapter extends BaseAdapter{
//定義兩個類別標志
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private Context mContext;
private ArrayList<Object> mData = null;
public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
this.mContext = mContext;
this.mData = mData;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//多布局的核心,通過這個判斷類別
@Override
public int getItemViewType(int position) {
if (mData.get(position) instanceof App) {
return TYPE_APP;
} else if (mData.get(position) instanceof Book) {
return TYPE_BOOK;
} else {
return super.getItemViewType(position);
}
}
//類別數(shù)目
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
if(convertView == null){
switch (type){
case TYPE_APP:
holder1 = new ViewHolder1();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false);
holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);
convertView.setTag(R.id.Tag_APP,holder1);
break;
case TYPE_BOOK:
holder2 = new ViewHolder2();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);
holder2.txt_bauthor = (TextView) convertView.findViewById(R.id.txt_bauthor);
convertView.setTag(R.id.Tag_Book,holder2);
break;
}
}else{
switch (type){
case TYPE_APP:
holder1 = (ViewHolder1) convertView.getTag(R.id.Tag_APP);
break;
case TYPE_BOOK:
holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);
break;
}
}
Object obj = mData.get(position);
//設置下控件的值
switch (type){
case TYPE_APP:
App app = (App) obj;
if(app != null){
holder1.img_icon.setImageResource(app.getaIcon());
holder1.txt_aname.setText(app.getaName());
}
break;
case TYPE_BOOK:
Book book = (Book) obj;
if(book != null){
holder2.txt_bname.setText(book.getbName());
holder2.txt_bauthor.setText(book.getbAuthor());
}
break;
}
return convertView;
}
//兩個不同的ViewHolder
private static class ViewHolder1{
ImageView img_icon;
TextView txt_aname;
}
private static class ViewHolder2{
TextView txt_bname;
TextView txt_bauthor;
}
}
這里有個地方要注意的,convertView.setTag(R.id.Tag_APP,holder1);我們平時都直接 setTag(Object)的,這個是setTag的重載方法,參數(shù)是一個唯一的key以及后面的一個對象! 唯一!?。∥乙婚_始直接把TYPE_BOOK作為第一個參數(shù),然后就報下面這個錯誤:
The key must be an application-specific resource id 就是前面這個要唯一,定義一個final類型的int變量和硬編碼一個值的方式都是行不通的 這里的做法是直接在strings.xml中添加:
<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id"></item>
當然你也可以在res/values/下另外創(chuàng)建一個ids.xml文件,把上面這段代碼貼上去! 除了這個還有一個要注意的地方,就是這個區(qū)分類別的標志要從0開始算,不然會報下面 這樣的錯誤:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private ListView list_content;
private ArrayList<Object> mData = null;
private MutiLayoutAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//數(shù)據(jù)準備:
mData = new ArrayList<Object>();
for(int i = 0;i < 20;i++){
switch ((int)(Math.random() * 2)){
case TYPE_BOOK:
mData.add(new Book("《第一行代碼》","郭霖"));
break;
case TYPE_APP:
mData.add(new App(R.mipmap.iv_icon_baidu,"百度"));
break;
}
}
list_content = (ListView) findViewById(R.id.list_content);
myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
list_content.setAdapter(myAdapter);
}
}
上面隨機生成0和1,0就往集合中添加一個Book的對象,1的話就添加一個App的對象!
好的,本節(jié)給大家講解了ListView Item多布局的實現(xiàn),就是兩個方法的重寫, 然后getView()做下判斷,設置不同的布局而已~代碼非常簡單~
關(guān)于ListView的知識就告一段落吧,當然ListView的知識并不止這些, 異步加載,優(yōu)化等等,這些我們都會在進階部分進行學習~就說這么多,謝謝~
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: