Android知識總結--ListView的BaseAdapter抽取

BaseAdapter的抽取

原型

一般繼承自BaseAdaper主要重寫getView()和getCount()方法,在getView方法中創建ViewHolder類(RecyclerView自帶ViewHolder,而ListView需要我們自己實現)避免重複調用findViewById。

這是一個典型的例子:

package rc.loveq.listviewadapter;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Author:Rc
 * Csdn:http://blog.csdn.net/loveqrc
 * 0n 2016/12/16 08:55
 * Email:[email protected]
 */

public class MyBaseAdapter extends BaseAdapter {
    private List<Product> mProducts;

    public MyBaseAdapter(List<Product> products) {
        mProducts = products;
    }

    @Override
    public int getCount() {
        return mProducts == null ? 0 : mProducts.size();
    }

    @Override
    public Object getItem(int position) {
        return mProducts.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(parent.getContext(), R.layout.item_product_list, null);
            holder=new ViewHolder(convertView);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mId.setText(mProducts.get(position).id);
        holder.mMemberNum.setText(mProducts.get(position).memberNum);
        holder.mMoney.setText(mProducts.get(position).money);
        holder.mName.setText(mProducts.get(position).name);

        return convertView;
        }
    }

     class ViewHolder {
        @BindView(R.id.name)
        TextView mName;
        @BindView(R.id.memberNum)
        TextView mMemberNum;
        @BindView(R.id.money)
        TextView mMoney;
        @BindView(R.id.id)
        TextView mId;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }

優化第一步–泛型的引入

從上面可以看出每次繼承自BaseAdapter其實就是實現那幾個方法,而每次重寫
差別都不會大,這時候我們可以引入泛型進行第一步封裝,至於具體的getView()方法抽取
成抽象的方法,讓由子類具體去實現。

package rc.loveq.listviewadapter;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

/**
 * Author:Rc
 * Csdn:http://blog.csdn.net/loveqrc
 * 0n 2016/12/16 09:41
 * Email:664215432@qq.com
 */

public abstract class MyBaseAdapter2<T> extends BaseAdapter {
    private List<T> mList;

    public MyBaseAdapter2(List<T> list) {
        mList = list;
    }

    @Override
    public int getCount() {
        return mList==null?0:mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getYourView(position,convertView,parent);
    }

    protected abstract View getYourView(int position, View convertView, ViewGroup parent);
}

通過第一步抽取之後,我們的代碼簡潔了很多,只要重寫getYourView方法即可。

  mLv.setAdapter(new MyBaseAdapter2<Product>(mList) {
            @Override
            protected View getYourView(int position, View convertView, ViewGroup parent) {

                return null;
            }
        });

優化第二步–ViewHolder的抽取

在第二步中,我們還是要自己創建ViewHolder,那有沒有什麼辦法在父類裏面做呢?

package rc.loveq.listviewadapter;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

/**
 * Author:Rc
 * Csdn:http://blog.csdn.net/loveqrc
 * 0n 2016/12/16 11:26
 * Email:664215432@qq.com
 */

public abstract class MyBaseAdapter3<T> extends BaseAdapter {
    private List<T> mList;

    public MyBaseAdapter3(List<T> list) {
        mList = list;
    }

    @Override
    public int getCount() {
        return mList==null?0:mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        BaseHolder holder=null;
        if (convertView == null) {
            holder=getHolder();
        }else{
            holder = (BaseHolder) convertView.getTag();
        }
        holder.onBindView(mList.get(position));
        return holder.mRootView;
    }

    protected abstract BaseHolder getHolder();
}

父類不知道怎麼做的,弄成抽象方法,交由子類具體去實現。

package rc.loveq.listviewadapter;

import android.view.View;

import butterknife.ButterKnife;

/**
 * Author:Rc
 * Csdn:http://blog.csdn.net/loveqrc
 * 0n 2016/12/16 11:28
 * Email:[email protected]
 */

public abstract class BaseHolder<T> {

    public View mRootView;

    public BaseHolder() {
        mRootView = initView();
        mRootView.setTag(this);
        ButterKnife.bind(this,mRootView);
    }

    protected abstract View initView();

    public abstract void onBindView(T t);
}

使用

     mLv.setAdapter(new MyBaseAdapter3<Product>(mList) {
            @Override
            protected BaseHolder getHolder() {
                return new MyViewHolder();
            }
        });

        }
    class MyViewHolder extends BaseHolder<Product> {

        @BindView(R.id.name)
        TextView mName;
        @BindView(R.id.memberNum)
        TextView mMemberNum;
        @BindView(R.id.money)
        TextView mMoney;
        @BindView(R.id.id)
        TextView mId;

        @Override
        protected View initView() {
            View view = View.inflate(MainActivity.this, R.layout.item_product_list, null);
            return view;
        }

        @Override
        public void onBindView(Product product) {
            mId.setText(product.id);
            mMemberNum.setText(product.memberNum);
            mMoney.setText(product.money);
            mName.setText(product.name);

        }
    }

下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章