前言:
在我們寫程序是經常會用到適配器,當系統自帶的適配器不夠用時即可自己定義適配器
正文:
因為我們用到的ListView視圖所以我們先初始化ListView,在我們的主活動中添加如下代碼
1 <ListView 2 android:id="@+id/lv" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 />
下面直接來Java代碼
1 package com.example.administrator.testmyadapter; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 import android.widget.BaseAdapter; 9 import android.widget.ListView; 10 import android.widget.TextView; 11 12 import java.util.ArrayList; 13 import java.util.List; 14 15 public class MainActivity extends AppCompatActivity { 16 private ListView lv; 17 private List<String>list; 18 private MyAdapter myAdapter; 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 lv=(ListView)findViewById(R.id.lv); 24 list=new ArrayList<String>(); 25 for (int i=0;i<=40;i++){ 26 list.add("數據"+i); 27 } 28 myAdapter=new MyAdapter(); 29 lv.setAdapter(myAdapter); 30 } 31 class MyAdapter extends BaseAdapter{ 32 @Override 33 //item的數量 34 public int getCount() { 35 return list.size(); 36 } 37 38 @Override 39 //item對象 40 public Object getItem(int position) { 41 return list.get(position); 42 } 43 44 @Override 45 //item對象的id 46 public long getItemId(int position) { 47 return position; 48 } 49 50 @Override 51 //獲取每一個item的view視圖 52 public View getView(int position, View convertView, ViewGroup parent) { 53 //獲取布局映射器對象 54 LayoutInflater inflater=LayoutInflater.from(MainActivity.this); 55 //將XML文件映射為view對象 56 View view=inflater.inflate(R.layout.my_item_activity,null); 57 //通過view對象找到控件 58 TextView textView=(TextView)view.findViewById(R.id.textview); 59 //賦值 60 textView.setText(list.get(position)); 61 return view; 62 } 63 } 64 }
步驟二:
初始化ListView:黃色部分都是初始化ListView
步驟三:
初始化數據源:淺青色都是初始化數據源,常規操作不需要講解
步驟四:
自定義適配器:1.添加名為MyAdapter的內部類 並且要繼承BaseAdapter重寫四個方法getCount(獲取item數量)getItem(獲取item對象)
getItemId(獲取Item對象id)getView(獲取每一個item的view視圖)
2.通過LayoutInflater調用from方法獲取布局映射器對象
3.通過布局映射器對象調用inflate方法,使將XML文件映射為view對象
4.通過view對象找到控件
5.對找到的控件對象調用setText進行賦值
6.返回view
問題:
上面寫的內容在每次划出新的item時會再次實例化對象,這樣就會耗費大量的時間
這一次我們使用convertView,這樣我們在滑到喲個新的item時會把之前滑出屏幕的item進行復用
來代碼:
1 public View getView(int position, View convertView, ViewGroup parent) { 2 Holder holder; 3 if(convertView==null){ 4 convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.my_item_activity,null); 5 holder=new Holder(); 6 holder.tv=(TextView)convertView.findViewById(R.id.textview); 7 //打標簽 8 convertView.setTag(holder); 9 }else { 10 //進行復用 11 holder=(Holder)convertView.getTag(); 12 } 13 holder.tv.setText(list.get(position)); 14 return convertView; 15 } 16 class Holder{ 17 TextView tv; 18 }
在這些代碼中仍然是在getView方法中進行操作,並再次添加一個內部類Holder,並且類中添加復用的控件
在getView方法中首先是一個判斷,if是在第一次進入程序中創建的,而且如果屏幕中顯示n個item則創建n+1個
第四行代碼是通過布局映射器把XML文件映射為convertView對象,然后讓復用標簽和給定標簽進行關聯
打標簽就是為了讓方便取出convertView中需要賦值的控件
在else中getTag課取出打進去的標簽
getView返回值是convertView
