一、前言
在Android开发中,常常需要使用到适配器,但是每次都直接继承BaseAdapter造成了很多重复的代码和逻辑,因此我们可以对BaseAdapter进行一次封装,大大减少我们的重复代码和逻辑
二、使用
这里介绍一个我在开发中使用的一个BaseAdapter的封装,它的优势有:
- 代码简单,只有不到100行的代码
- 效率高,内部已完成ViewHolder的重用,静态的ViewHolder内部类更节约资源,加载速度更快,并用更高效的SparseArray存储View
- 使用简单,使用如下
- public class TestAdapter extends MyBaseAdapter<Person> {
-
- private ImageView image;
- private TextView name;
-
-
-
-
-
- public TestAdapter(Context context, List<Person> list, int layout) {
- super(context, list, layout);
- }
-
- @Override
- public void convert(ViewHolder holder, Person person) {
- image = holder.findViewById(R.id.image);
- name = holder.findViewById(R.id.name);
- image.setImageResource(R.mipmap.ic_launcher);
- name.setText(person.getName());
- }
- }
我们只需要继承MyBaseAdapter,并重写必要的构造方法和抽象方法即可。其中Person类为一个bean类。
三、效果图
四、MyBaseAdapter及其它类
- package com.afei.baseadapterdemo.adapter;
-
- import java.util.List;
-
- import android.content.Context;
- import android.util.SparseArray;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
-
- public abstract class MyBaseAdapter<T> extends BaseAdapter {
- protected Context mContext;
- protected List<T> mList;
- protected int mLayout;
-
- public MyBaseAdapter(Context context, List<T> list, int layout) {
- this.mContext = context;
- this.mList = list;
- this.mLayout = layout;
- }
-
- @Override
- public int getCount() {
- return mList == null ? 0 : mList.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mList == null ? null : mList.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = ViewHolder.getInstance(mContext, convertView, mLayout);
- convert(holder, mList.get(position));
- return holder.getConvertView();
- }
-
-
-
-
- public abstract void convert(ViewHolder holder, T t);
-
- protected static class ViewHolder {
- private View convertView;
- private SparseArray<View> views;
-
- private ViewHolder(View convertView) {
- this.views = new SparseArray<View>();
- this.convertView = convertView;
- convertView.setTag(this);
- }
-
- public static ViewHolder getInstance(Context context, View convertView, int layout) {
- if (convertView == null) {
- convertView = LayoutInflater.from(context).inflate(layout, null);
- return new ViewHolder(convertView);
- }
- return (ViewHolder) convertView.getTag();
- }
-
- @SuppressWarnings("unchecked")
- public <T extends View> T findViewById(int id) {
- View view = views.get(id);
- if (view == null) {
- view = convertView.findViewById(id);
- views.append(id, view);
- }
- return (T) view;
- }
-
- private View getConvertView() {
- return convertView;
- }
- }
- }
- public class Person {
-
- private String name;
-
- public Person(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
- package com.afei.baseadapterdemo;
-
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.widget.ListView;
-
- import com.afei.baseadapterdemo.adapter.TestAdapter;
- import com.afei.baseadapterdemo.bean.Person;
-
- import java.util.ArrayList;
-
- public class MainActivity extends AppCompatActivity {
-
- private ListView mListView;
-
- private TestAdapter mAdapter;
- private ArrayList<Person> mList;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
-
- private void initView() {
- mListView = (ListView) findViewById(R.id.listView);
- mList = new ArrayList<>();
- for (int i = 0; i < 20; i++) {
- mList.add(new Person("美女" + i));
- }
- mAdapter = new TestAdapter(this, mList, R.layout.item_list);
- mListView.setAdapter(mAdapter);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.afei.baseadapterdemo.MainActivity">
-
- <ListView
- android:id="@+id/listView"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </RelativeLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:padding="20dp">
-
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <TextView
- android:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"/>
-
- </LinearLayout>