BaseAdapter简单封装

来源:互联网 发布:mplayerx mac dmg 编辑:程序博客网 时间:2024/05/19 03:43

一、前言

在Android开发中,常常需要使用到适配器,但是每次都直接继承BaseAdapter造成了很多重复的代码和逻辑,因此我们可以对BaseAdapter进行一次封装,大大减少我们的重复代码和逻辑


二、使用

这里介绍一个我在开发中使用的一个BaseAdapter的封装,它的优势有:

  1. 代码简单,只有不到100行的代码
  2. 效率高,内部已完成ViewHolder的重用,静态的ViewHolder内部类更节约资源,加载速度更快,并用更高效的SparseArray存储View
  3. 使用简单,使用如下

[java] view plain copy
  1. public class TestAdapter extends MyBaseAdapter<Person> {  
  2.   
  3.     private ImageView image;  
  4.     private TextView name;  
  5.   
  6.     /** 
  7.      * @param list 数据 
  8.      * @param layout 布局id 
  9.      */  
  10.     public TestAdapter(Context context, List<Person> list, int layout) {  
  11.         super(context, list, layout);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void convert(ViewHolder holder, Person person) {  
  16.         image = holder.findViewById(R.id.image);  
  17.         name = holder.findViewById(R.id.name);  
  18.         image.setImageResource(R.mipmap.ic_launcher);  
  19.         name.setText(person.getName());  
  20.     }  
  21. }  
我们只需要继承MyBaseAdapter,并重写必要的构造方法和抽象方法即可。其中Person类为一个bean类。


三、效果图



四、MyBaseAdapter及其它类

  • MyBaseAdapter类

[java] view plain copy
  1. package com.afei.baseadapterdemo.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.util.SparseArray;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11.   
  12. public abstract class MyBaseAdapter<T> extends BaseAdapter {  
  13.     protected Context mContext;  
  14.     protected List<T> mList; // 数据  
  15.     protected int mLayout; // 布局id  
  16.   
  17.     public MyBaseAdapter(Context context, List<T> list, int layout) {  
  18.         this.mContext = context;  
  19.         this.mList = list;  
  20.         this.mLayout = layout;  
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         return mList == null ? 0 : mList.size();  
  26.     }  
  27.   
  28.     @Override  
  29.     public Object getItem(int position) {  
  30.         return mList == null ? null : mList.get(position);  
  31.     }  
  32.   
  33.     @Override  
  34.     public long getItemId(int position) {  
  35.         return position;  
  36.     }  
  37.   
  38.     @Override  
  39.     public View getView(int position, View convertView, ViewGroup parent) {  
  40.         ViewHolder holder = ViewHolder.getInstance(mContext, convertView, mLayout);  
  41.         convert(holder, mList.get(position)); // 子类重写的方法,完成holder中view的初始化  
  42.         return holder.getConvertView();  
  43.     }  
  44.   
  45.     /** 
  46.      * 子类必须重写的方法,通过这个方法初始化holder中的View即可 
  47.      */  
  48.     public abstract void convert(ViewHolder holder, T t);  
  49.   
  50.     protected static class ViewHolder {  
  51.         private View convertView;  
  52.         private SparseArray<View> views;  
  53.   
  54.         private ViewHolder(View convertView) {  
  55.             this.views = new SparseArray<View>();  
  56.             this.convertView = convertView;  
  57.             convertView.setTag(this);  
  58.         }  
  59.   
  60.         public static ViewHolder getInstance(Context context, View convertView, int layout) {  
  61.             if (convertView == null) {  
  62.                 convertView = LayoutInflater.from(context).inflate(layout, null);  
  63.                 return new ViewHolder(convertView);  
  64.             }  
  65.             return (ViewHolder) convertView.getTag(); // 重用convertView  
  66.         }  
  67.   
  68.         @SuppressWarnings("unchecked")  
  69.         public <T extends View> T findViewById(int id) {  
  70.             View view = views.get(id); // 同id的控件可重复使用,无需再次findViewById  
  71.             if (view == null) {  
  72.                 view = convertView.findViewById(id);  
  73.                 views.append(id, view); // 将此id的控件添加进sparseArray  
  74.             }  
  75.             return (T) view;  
  76.         }  
  77.   
  78.         private View getConvertView() {  
  79.             return convertView;  
  80.         }  
  81.     }  
  82. }  

  • Person类

[java] view plain copy
  1. public class Person {  
  2.   
  3.     private String name;  
  4.   
  5.     public Person(String name) {  
  6.         this.name = name;  
  7.     }  
  8.   
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.   
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16. }  

  • MainActivity

[java] view plain copy
  1. package com.afei.baseadapterdemo;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5. import android.widget.ListView;  
  6.   
  7. import com.afei.baseadapterdemo.adapter.TestAdapter;  
  8. import com.afei.baseadapterdemo.bean.Person;  
  9.   
  10. import java.util.ArrayList;  
  11.   
  12. public class MainActivity extends AppCompatActivity {  
  13.   
  14.     private ListView mListView;  
  15.   
  16.     private TestAdapter mAdapter;  
  17.     private ArrayList<Person> mList;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         initView();  
  24.     }  
  25.   
  26.     private void initView() {  
  27.         mListView = (ListView) findViewById(R.id.listView);  
  28.         mList = new ArrayList<>();  
  29.         for (int i = 0; i < 20; i++) {  
  30.             mList.add(new Person("美女" + i));  
  31.         }  
  32.         mAdapter = new TestAdapter(this, mList, R.layout.item_list);  
  33.         mListView.setAdapter(mAdapter);  
  34.     }  
  35. }  

  • activity_main.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context="com.afei.baseadapterdemo.MainActivity">  
  7.   
  8.     <ListView  
  9.         android:id="@+id/listView"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent" />  
  12. </RelativeLayout>  

  • item_list.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal"  
  6.     android:gravity="center_vertical"  
  7.     android:padding="20dp">  
  8.   
  9.     <ImageView  
  10.         android:id="@+id/image"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content" />  
  13.   
  14.     <TextView  
  15.         android:id="@+id/name"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_marginLeft="20dp"/>  
  19.   
  20. </LinearLayout>  
0 0