大家好,今天總結一片ListView加載不同Item布局的博客,在Android的app開發當中ListView貌似是基本配置,一般我們的ListView主要是作為列表類型的數據展示,普通的展示數據很好做,無非就是利用Volley、Xutils等等框架請求,然后Gosn或其他的解析,ImageLoader加載並顯示圖片,其實今天也用這些但是要做一些處理,網易新聞我想大部分人都看過,它的ListView展示數據的Item的布局有幾種,而不是一種那么這種ListView展示的數據結構,是如何實現的呢,其實要實現這個效果有很多方法,比如:我們可以在adapter中通過type來加載不同的item布局,如果比較簡單的話我們有時也可以利用ScrollView嵌套多個ListView或者GridView實現,還有就是通過Android5.0的中新的特性控件RecyclerView來輕松實現,這些方法我會在下面的博客當中講解,今天主要是同過type來實現,通過type來實現加載不同Item的布局有個好處就是,條理清晰,不容易出錯(上代碼前給大家看個效果圖)。下面就進入主題,上代碼................
1 public class ListViewTypeActivity extends AppCompatActivity { 2 3 private ListView listview; 4 private Integer[]images2={R.drawable.appmain_subject_1,
R.drawable.appmain_subject_1,R.drawable.appmain_subject_1}; 5 private Integer[]images={R.drawable.appmain_subject_1}; 6 public List<DataModel> listDatamodel = new ArrayList<DataModel>(); 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_list_view_type); 12 InitView(); 13 14 } 15 16 public void InitView() { 17 initData(); 18 listview = (ListView) findViewById(R.id.listview); 19 listview.setAdapter(new MyAdapter(listDatamodel,this)); 20 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 21 @Override 22 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 23 Toast.makeText(ListViewTypeActivity.this,
listDatamodel.get(position).getDmiaoshu()+"",Toast.LENGTH_SHORT).show(); 24 } 25 }); 26 } 27 28 /** 初始化數據 29 public void initData() { 30 for (int i = 0; i <1; i++) { 31 DataModel dml = new DataModel(images,"一個美女","一個美女"); 32 listDatamodel.add(dml); 33 } 34 for (int i = 0; i <1 ; i++) { 35 DataModel dml = new DataModel(images2,"三個美女","三個美女"); 36 listDatamodel.add(dml); 37 } 38 for (int i = 0; i <2 ; i++) { 39 DataModel dml = new DataModel(images,"一個美女","一個美女"); 40 listDatamodel.add(dml); 41 } 42 for (int i = 0; i <1 ; i++) { 43 DataModel dml = new DataModel(images2,"三個美女","三個美女"); 44 listDatamodel.add(dml); 45 } 46 for (int i = 0; i <3 ; i++) { 47 DataModel dml = new DataModel(images,"一個美女","一個美女"); 48 listDatamodel.add(dml); 49 } 50 for (int i = 0; i <1 ; i++) { 51 DataModel dml = new DataModel(images2,"三個美女","三個美女"); 52 listDatamodel.add(dml); 53 } 54 }
Activity的代碼非常簡單,我就不講解了,接下來我們來看核心的adapter的代碼
1 package com.example.joexiang.listviewtypedemo; 2 import android.content.Context; 3 import android.text.TextUtils; 4 import android.view.LayoutInflater; 5 import android.view.View; 6 import android.view.ViewGroup; 7 import android.widget.BaseAdapter; 8 import android.widget.ImageView; 9 import android.widget.TextView; 10 import java.util.List; 11 12 /** 13 * Created by joe.xiang on 2016/2/15. 14 */ 15 public class MyAdapter extends BaseAdapter { 16 public LayoutInflater mInflater; 17 public List<DataModel> listDatamodel; 18 //加載布局類型 19 public static final int LAYOUTONE=1; 20 public static final int LAYOUTTWO=2; 21 22 public MyAdapter(List<DataModel> listDatamodel,Context context) { 23 this.listDatamodel = listDatamodel; 24 mInflater = LayoutInflater.from(context); 25 } 26 27 @Override 28 public int getCount() { 29 return listDatamodel.size(); 30 } 31 32 33 /** 34 * 決定加載那個類型的Item布局 35 * @param position 36 * @return 37 */ 38 @Override 39 public int getItemViewType(int position) { 40 DataModel dml= listDatamodel.get(position); 41 String dtitle = dml.dtitle.trim(); 42 if(!TextUtils.isEmpty(dtitle)&&dtitle.equals("三個美女")){ 43 return LAYOUTTWO; 44 }else{ 45 return LAYOUTONE; 46 } 47 } 48 49 50 /** 51 * 52 * @return 53 */ 54 @Override 55 public int getViewTypeCount() { 56 return 3; 57 } 58 59 @Override 60 public Object getItem(int position) { 61 return listDatamodel.get(position); 62 } 63 64 @Override 65 public long getItemId(int position) { 66 return position; 67 } 68 69 @Override 70 public View getView(final int position, View convertView, ViewGroup parent) { 71 //得到加載布局的類型 72 int viewType = getItemViewType(position); 73 ViewHolder1 viewHolder1 = null; 74 ViewHolder2 viewHolder2 = null; 75 if (convertView==null){
//根據返回類型加載不同的布局文件和創建不同的緩存類ViewHolder 76 switch (viewType){ 77 case 1: 78 convertView = mInflater.inflate(R.layout.content_list_view_type,null); 79 viewHolder1 = new ViewHolder1(); 80 viewHolder1.imageview = (ImageView) convertView.findViewById(R.id.image); 81 viewHolder1.tv = (TextView) convertView.findViewById(R.id.pname); 82 convertView.setTag(viewHolder1); 83 break; 84 case 2: 85 convertView = mInflater.inflate(R.layout.content_list_view_type2,null); 86 viewHolder2 = new ViewHolder2(); 87 viewHolder2.imageview2 = (ImageView) convertView.findViewById(R.id.image1); 88 viewHolder2.tv2 = (TextView) convertView.findViewById(R.id.pname2); 89 convertView.setTag(viewHolder2); 90 break; 91 } 92 }else{ 93 switch (viewType){ 94 case 1: 95 viewHolder1 = (ViewHolder1)convertView.getTag(); 96 break; 97 case 2: 98 viewHolder2 = (ViewHolder2)convertView.getTag(); 99 break; 100 } 101 }
//根據返回類型來展示不同的數據 102 switch (viewType){ 103 case 1: 104 Integer[] images = listDatamodel.get(position).getDimage(); 105 for (int i = 0; i <images.length ; i++) { 106 viewHolder1.imageview.setImageResource(images[i]); 107 } 108 viewHolder1.tv.setText(listDatamodel.get(position).getDmiaoshu()); 109 break; 110 case 2: 111 Integer[] images2 = listDatamodel.get(position).getDimage(); 112 for (int i = 0; i <images2.length ; i++) { 113 viewHolder2.imageview2.setImageResource(images2[i]); 114 } 115 viewHolder2.tv2.setText(listDatamodel.get(position).getDmiaoshu()); 116 break; 117 } 118 return convertView; 119 } 120 121 class ViewHolder1{ 122 TextView tv; 123 ImageView imageview; 124 } 125 class ViewHolder2{ 126 TextView tv2; 127 ImageView imageview2; 128 } 129 }
主要是通過GetItemViewType()來決定加載那一個布局,getViewTypeCount()返回顯示Item的最布局數量,在getView()方法中通過getItemViewType()來獲得當前加載的布局類型,在根據類型制定加載的布局,和相應的緩存類,設置值也是通過該返回類型來確定。咳咳到此本篇博客介紹完畢了,希望能幫到需要幫助的人。