Android Listview中顯示不同的視圖布局詳解及實例代碼
Android Listview中顯示不同的視圖布局
1. 使用場景
在重寫ListView的BaseAdapter時,我們常常在getView()方法中復(fù)用convertView,以提高性能。convertView在Item為單一的同種類型布局時,能夠回收并重用,但是多個Item布局類型不同時,convertView的回收和重用會出現(xiàn)問題。比如有些行為純文本,有些行則是圖文混排,這里純文本行為一類布局,圖文混排的行為第二類布局。單一類型的ListView很簡單,下面著重介紹一下ListView包含多種類型視圖布局的情形。
2.ListView包含不同Item的布局
我們需要做這些工作:
1)重寫 getViewTypeCount() – 該方法返回多少個不同的布局
2)重寫 getItemViewType(int) – 根據(jù)position返回相應(yīng)的Item
3)根據(jù)view item的類型,在getView中創(chuàng)建正確的convertView
3.案例
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 = new ArrayList<String>();
for(int i = 0 ; i < 100 ; i++)
{
listString.add(Integer.toString(i));
}
listAdapter = new MyAdapter(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
return listString.size();
}
//每個convert view都會調(diào)用此方法,獲得當(dāng)前所需要的view樣式
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
int p = position%6;
if(p == 0)
return TYPE_1;
else if(p < 3)
return TYPE_2;
else if(p < 6)
return TYPE_3;
else
return TYPE_1;
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 3;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listString.get(arg0);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@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");
//按當(dāng)前所需的樣式,確定new的布局
switch(type)
{
case TYPE_1:
convertView = inflater.inflate(R.layout.listitem1, parent, false);
holder1 = new viewHolder1();
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;
case TYPE_2:
convertView = inflater.inflate(R.layout.listitem2, parent, false);
holder2 = new viewHolder2();
holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
Log.e("convertView = ", "NULL TYPE_2");
convertView.setTag(holder2);
break;
case TYPE_3:
convertView = inflater.inflate(R.layout.listitem3, parent, false);
holder3 = new viewHolder3();
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)
{
case TYPE_1:
holder1 = (viewHolder1) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_1");
break;
case TYPE_2:
holder2 = (viewHolder2) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_2");
break;
case TYPE_3:
holder3 = (viewHolder3) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_3");
break;
}
}
//設(shè)置資源
switch(type)
{
case TYPE_1:
holder1.textView.setText(Integer.toString(position));
holder1.checkBox.setChecked(true);
break;
case TYPE_2:
holder2.textView.setText(Integer.toString(position));
break;
case TYPE_3:
holder3.textView.setText(Integer.toString(position));
holder3.imageView.setBackgroundResource(R.drawable.icon);
break;
}
return convertView;
}
}
//各個布局的控件資源
class viewHolder1{
CheckBox checkBox;
TextView textView;
}
class viewHolder2{
TextView textView;
}
class viewHolder3{
ImageView imageView;
TextView textView;
}
}
感謝閱讀,希望能幫助到大家, 謝謝大家對本站的支持!
- Android ListView里控件添加監(jiān)聽方法的實例詳解
- Android ListView監(jiān)聽滑動事件的方法(詳解)
- android動態(tài)布局之動態(tài)加入TextView和ListView的方法
- Android ListView添加頭布局和腳布局實例詳解
- Android中ListView Item布局優(yōu)化技巧
- Android實現(xiàn)的ListView分組布局改進示例
- Android ListView自動顯示隱藏布局的實現(xiàn)方法
- Android自定義listview布局實現(xiàn)上拉加載下拉刷新功能
- Android App界面的ListView布局實戰(zhàn)演練
- Android開發(fā)實現(xiàn)ListView部分布局監(jiān)聽的方法
相關(guān)文章
Android 根據(jù)EditText搜索框ListView動態(tài)顯示數(shù)據(jù)
這篇文章主要介紹了Android 根據(jù)EditText搜索框ListView動態(tài)顯示數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android 使用viewpager實現(xiàn)無限循環(huán)(定時+手動)
這篇文章主要介紹了Android 使用viewpager實現(xiàn)無限循環(huán)(定時+手動)的相關(guān)資料,需要的朋友可以參考下2015-11-11
Android編程實現(xiàn)保存圖片到系統(tǒng)圖庫的方法示例
這篇文章主要介紹了Android編程實現(xiàn)保存圖片到系統(tǒng)圖庫的方法,結(jié)合實例形式分析了Android保存圖片到系統(tǒng)圖庫的常見操作方法、注意事項與相關(guān)問題解決技巧,需要的朋友可以參考下2017-08-08
Android使用 Coroutine + Retrofit打造簡單的HTTP請求庫
這篇文章主要介紹了Android使用 Coroutine + Retrofit打造簡單的HTTP請求庫,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03
解決AndroidStudio無法運行java中的mian方法問題
這篇文章主要介紹了解決AndroidStudio無法運行java中的mian方法問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Android?Studio中如何修改APP圖標(biāo)和APP名稱
這篇文章主要介紹了Android?Studio中如何修改APP圖標(biāo)和APP名稱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Android混合開發(fā)教程之WebView的使用方法總結(jié)
WebView是一個基于webkit引擎、展現(xiàn)web頁面的控件,下面這篇文章主要給大家介紹了關(guān)于Android混合開發(fā)教程之WebView的使用方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧2018-05-05

