php listview,ListView Item多布局的实现
ListView Item多布局的實現
本節引言:本節是ListView這個小節的最后一節,給大家帶來的是ListView多布局Item的實現,
何為ListView Item多布局,打個比方,QQ這種聊天列表:
假如他是用一個ListView做的,那么一個ListView上不就有兩種不同的Item咯!
一左一右,嘿嘿,本節就來教大家如何實現ListView的多布局!
1.要點講解:重寫getItemViewType()方法對應View是哪個類別,以及getViewTypeCount()方法iew返回
總共多少個類別!然后再getView那里調用getItemViewType獲得對應類別,再加載對應的View!
2.代碼實現:這里的話直接用上一節的兩個布局,然后另外寫一個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?mData?=?null;
public?MutiLayoutAdapter(Context?mContext,ArrayList?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);
}
}
//類別數目
@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的重載方法,參數是一個唯一的key以及后面的一個對象!
唯一!!!我一開始直接把TYPE_BOOK作為第一個參數,然后就報下面這個錯誤:
The key must be an application-specific resource id就是前面這個要唯一,定義一個final類型的int變量和硬編碼一個值的方式都是行不通的
這里的做法是直接在strings.xml中添加:
當然你也可以在res/values/下另外創建一個ids.xml文件,把上面這段代碼貼上去!
除了這個還有一個要注意的地方,就是這個區分類別的標志要從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?mData?=?null;
private?MutiLayoutAdapter?myAdapter?=?null;
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//數據準備:
mData?=?new?ArrayList();
for(int?i?=?0;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的對象!
3.代碼下載:
ListViewDemo6.zip
本節小結:好的,本節給大家講解了ListView Item多布局的實現,就是兩個方法的重寫,
然后getView()做下判斷,設置不同的布局而已~代碼非常簡單~
關于ListView的知識就告一段落吧,當然ListView的知識并不止這些,
異步加載,優化等等,這些我們都會在進階部分進行學習~就說這么多,謝謝~
總結
以上是生活随笔為你收集整理的php listview,ListView Item多布局的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java9.0.1教学,零基础Java基
- 下一篇: php beego,MixPHP 2.2