Adapter万能适配器(泛型实现)

  在软件开发的过程中,使用自定义适配器是非常普遍的,每次写的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 }
如何使用万能适配器

如果认为我写的好,记得点个赞,你们的点赞就是我写博客的动力!! 耶耶耶耶耶!!!!!!!!!!!!

猜你喜欢

转载自www.cnblogs.com/mCarrYoung/p/9010500.html