在软件开发的过程中,使用自定义适配器是非常普遍的,每次写的ListView参数都不一样,这时我们自己不如写一个完成能的适配器,来达到节约我们的编写代码的时间。
我们写的自定义适配器不过是继承BaseAdapter,在重写4个方法,前三个方法基本是相同的,我们只修要修改第4个getView方法,getView里面你需要处理,控件的复用,和控件的数据绑定,又需要一个叫ViewHolder的静态类,普通的实现自定义适配器,我相信经常做项目的人,没见过1000也见过800了,但是这样每次需要不同的ListView我们就需要重新写一个适配器,虽然说这种适配器我们写的非常熟练了,但是这样也会浪费我们的时间,下面我们通过泛型来实现万能自定义适配器。
首先我先把list_view 的XMl文件让大家看下,以免在代码中,大家不知道是什么控件:
这里面的控件我填了一些默认的值: 这里的代码我就不写注释了,想必大家也都知道什么意思
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ImageView 7 android:id="@+id/commodityPic" 8 android:layout_width="200dp" 9 android:layout_height="200dp" 10 android:src="@drawable/txueone"/> 11 12 <LinearLayout 13 android:layout_below="@id/commodityPic" 14 android:layout_width="200dp" 15 android:layout_height="wrap_content" 16 android:orientation="vertical"> 17 18 <LinearLayout 19 android:layout_width="200dp" 20 android:layout_height="wrap_content" 21 android:orientation="horizontal"> 22 23 <TextView 24 android:id="@+id/commodityTitle" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:textSize="15sp" 28 android:text="夏季男士短袖T恤男七分袖男生宽松韩版潮流衣服夏装"/> 29 </LinearLayout> 30 31 <TextView 32 android:id="@+id/commodityAddr" 33 android:layout_marginRight="10dp" 34 android:layout_gravity="right" 35 android:layout_width="wrap_content" 36 android:layout_height="wrap_content" 37 android:text="地址"/> 38 39 <LinearLayout 40 android:layout_width="200dp" 41 android:layout_height="wrap_content" 42 android:orientation="horizontal"> 43 44 <TextView 45 android:id="@+id/commodityPrice" 46 android:layout_width="wrap_content" 47 android:layout_height="wrap_content" 48 android:textColor="#ff0000" 49 android:textSize="20sp" 50 android:text="58.2"/> 51 52 <TextView 53 android:id="@+id/commodityPay" 54 android:layout_marginLeft="20dp" 55 android:layout_width="wrap_content" 56 android:layout_height="wrap_content" 57 android:text="6250人付款"/> 58 59 </LinearLayout> 60 61 62 </LinearLayout> 63 64 </RelativeLayout>
这下面是自定义适配器代码:
1 package com.sang.carr.adapters; 2 3 import android.content.Context; 4 import android.util.SparseArray; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 import android.widget.BaseAdapter; 9 import android.widget.ImageView; 10 import android.widget.TextView; 11 12 import java.util.ArrayList; 13 14 public abstract class ListAdapter<T> extends BaseAdapter { 15 16 private ArrayList<T> list; 17 private int mLayout; 18 19 public ListAdapter(ArrayList<T> list, int mLayout) { 20 this.list = list; 21 this.mLayout = mLayout; 22 } 23 24 @Override 25 public int getCount() { 26 return list != null ? list.size() : 0; 27 } 28 29 @Override 30 public T getItem(int position) { 31 return list.get(position); 32 } 33 34 @Override 35 public long getItemId(int position) { 36 return position; 37 } 38 39 @Override 40 public View getView(int position, View convertView, ViewGroup parent) { 41 ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayout, position); 42 bindView(holder, getItem(position)); 43 return holder.getItemView(); 44 } 45 46 47 public abstract void bindView(ViewHolder holder, T obj); 48 49 static class ViewHolder { 50 private SparseArray<View> mView; 51 private Context mContext;
//这里item可以理解成存放convertView 52 private View item; 53 private int position; 54 55 public ViewHolder(Context mContext, ViewGroup partent, int layoutRes) { 56 this.mView = new SparseArray<>(); 57 this.mContext = mContext; 58 View convertView = LayoutInflater.from(mContext).inflate(layoutRes, partent, false); 59 convertView.setTag(this); 60 this.item = convertView; 61 } 62 63 public static ViewHolder bind(Context mContext, View convertView, ViewGroup partent, int mLayoutRes, int position) { 64 ViewHolder holder; 65 if (convertView == null) { 66 holder = new ViewHolder(mContext, partent, mLayoutRes); 67 } else { 68 holder = (ViewHolder) convertView.getTag(); 69 holder.item = convertView; 70 } 71 holder.position = position; 72 return holder; 73 } 74 75 public View getItemView() { 76 return item; 77 } 78 79 public <T extends View> T getView(int id) { 80 T t = (T) mView.get(id); 81 if (t == null) { 82 t = item.findViewById(id); 83 mView.put(id, t); 84 } 85 return t; 86 } 87 88 //设置图片 89 public ViewHolder setIamg(int id,int ImageId){ 90 View view = getView(id); 91 if(view instanceof ImageView){ 92 ((ImageView) view).setImageResource(ImageId); 93 } 94 return this; 95 } 96 //设置标题 97 public ViewHolder setTitle(int id,String Title){ 98 View view = getView(id); 99 if(view instanceof TextView){ 100 ((TextView) view).setText(Title); 101 } 102 return this; 103 } 104 //设置地址 105 public ViewHolder setAddr(int id, String addr){ 106 View view = getView(id); 107 if(view instanceof TextView){ 108 ((TextView) view).setText(addr); 109 } 110 return this; 111 } 112 //设置价格 113 public ViewHolder setPri(int id,String pri){ 114 View view = getView(id); 115 if(view instanceof TextView){ 116 ((TextView) view).setText(pri); 117 } 118 return this; 119 } 120 //设置付款人数 121 public ViewHolder setPay(int id, String pay){ 122 View view = getView(id); 123 if(view instanceof TextView ){ 124 ((TextView) view).setText(pay); 125 } 126 return this; 127 } 128 } 129 }
这些代码大家看着应该很熟悉了吧,哈哈,没错这些就是我们平时写的自定义适配器的代码,getCount、getItem、getItemId这几个方法我就不用再做解释了,想必大家对于这些代码都很熟悉了吧。
打下看下第63行的bind的代码,这里我们是要把ViewHolder和Item绑定起来,convertView如果是空的话,我们需要使用ViewHolder的构造来创建一个converView,如果存在我们直接可以使用getTag取出来就可以了。然后把值给item就可以了,这里为什么非要把值给item因为我们后面好要给控件设置数据,回到我们第14 16行代码,这里为什么要使用<T>,因为我们是要做的万能适配器,所以这里我们要使用泛型,这里我们需要在ViewHold中写一个getItemView(在第75行到77行)当然这个方法也可以自己写一个,因为我们这里要取item,其实在getView中也可以直接点出Item,但是为了保险起见嘛,那就写个getItemView获取吧。
这样就是一个万能的适配器了,下面那我贴下使用时的代码吧!! 嘿嘿 ,记得点下赞哦
如何使用:
1 package com.sang.carr.adapters; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.widget.ListView; 6 7 import java.util.ArrayList; 8 9 public class MainActivity extends AppCompatActivity { 10 11 private ListView listView; 12 private ArrayList<Commodity> list; 13 private int[] Pic = {R.drawable.txueone, R.drawable.txuetow, R.drawable.txuethere}; 14 private String[] Tiltle = {"夏季男士短袖T恤韩版潮修身衣服男", "圆领宽松夏季韩版纯色修身白色T恤", "2018新款夏季男士短袖T恤韩版五分半袖衫潮流宽松"}; 15 private String[] Addr = {"厦门", "聊城", "广州"}; 16 private String[] Pri = {"52.7", "45.5", "87.9"}; 17 private String[] Pay = {"6223人付款", "1.4万人付款", "7566人付款"}; 18 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 listView = findViewById(R.id.ls); 25 initData(); 26 setListViewAdapter(); 27 } 28 29 private void setListViewAdapter() { 30 listView.setAdapter(new ListAdapter<Commodity>(list, R.layout.one) { 31 @Override 32 public void bindView(ViewHolder holder, Commodity obj) { 33 holder.setIamg(R.id.commodityPic, obj.getCommodityPic()); 34 holder.setTitle(R.id.commodityTitle, obj.getCommodityTitle()); 35 holder.setAddr(R.id.commodityAddr, obj.getCommodityAddr()); 36 holder.setPri(R.id.commodityPrice, obj.getCommodityPri()); 37 holder.setPay(R.id.commodityPay, obj.getCommodityPay()); 38 } 39 }); 40 } 41 42 private void initData() { 43 list = new ArrayList<>(); 44 for (int j = 0; j < 20; j++) { 45 for (int i = 0; i < 3; i++) { 46 list.add(new Commodity(Pic[i], Tiltle[i], Addr[i], Pri[i], Pay[i])); 47 } 48 } 49 50 } 51 }
如果认为我写的好,记得点个赞,你们的点赞就是我写博客的动力!! 耶耶耶耶耶!!!!!!!!!!!!