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-09Android 使用viewpager實現(xiàn)無限循環(huán)(定時+手動)
這篇文章主要介紹了Android 使用viewpager實現(xiàn)無限循環(huán)(定時+手動)的相關(guān)資料,需要的朋友可以參考下2015-11-11Android編程實現(xiàn)保存圖片到系統(tǒng)圖庫的方法示例
這篇文章主要介紹了Android編程實現(xiàn)保存圖片到系統(tǒng)圖庫的方法,結(jié)合實例形式分析了Android保存圖片到系統(tǒng)圖庫的常見操作方法、注意事項與相關(guān)問題解決技巧,需要的朋友可以參考下2017-08-08Android使用 Coroutine + Retrofit打造簡單的HTTP請求庫
這篇文章主要介紹了Android使用 Coroutine + Retrofit打造簡單的HTTP請求庫,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03解決AndroidStudio無法運行java中的mian方法問題
這篇文章主要介紹了解決AndroidStudio無法運行java中的mian方法問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Android?Studio中如何修改APP圖標(biāo)和APP名稱
這篇文章主要介紹了Android?Studio中如何修改APP圖標(biāo)和APP名稱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11Android混合開發(fā)教程之WebView的使用方法總結(jié)
WebView是一個基于webkit引擎、展現(xiàn)web頁面的控件,下面這篇文章主要給大家介紹了關(guān)于Android混合開發(fā)教程之WebView的使用方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧2018-05-05