继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

打造Android万能适配器Adapter

jmesSehng
关注TA
已关注
手记 149
粉丝 424
获赞 5663
打造Android万能适配器Adapter

adapter经常遇到,所以封装了一下,主要是从一下几个方面展开

这篇是受到两位朋友的代码启发写的,感谢一下

1.BaseAdapter的抽象方法实现:

getItem(),getCount(),getItemId()

2.getView的实现

主要是convertView和ViewHolder

3.对于viewHolder的抽象方法和绑定数据的抽象方法
4.对于数据源的封装

主要是set和get以及增删改查的加锁

5.代码实现如下:

import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by 刘朋(liupeng) on 2017/4/7.
 */

public abstract class BaseArrayAdapter<D,Holder> extends BaseAdapter{
  private List<D> mInfos = new ArrayList<>();
  private final Object mLock = new Object();

  protected LayoutInflater mInflater;
  protected Context context;
  private boolean mNotifyOnChange = true;

  //传递context引用进来

  public BaseArrayAdapter(Context context) {
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
  }

  //mNotifyOnChange是一个控制的开关
  @Override
  public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
    mNotifyOnChange = true;
  }
  public void setNotifyOnChange(boolean notifyOnChange) {
    mNotifyOnChange = notifyOnChange;
  }

  public Context getContext() {
    return context;
  }

  public int getCount() {
    return isEmpty() ? 0 : mInfos.size();
  }

  public D getItem(int position) {
    return isEmpty() ? null : mInfos.get(position);
  }

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

  //覆写getView
  @Override public View getView(int position, View convertView, ViewGroup parent) {
    Holder holder;
    D d = getItem(position);
    if (convertView == null) {
      convertView = mInflater.inflate(getLayoutId(), parent, false);
      holder = onCreateViewHolder(convertView);
      convertView.setTag(holder);
    } else {
      holder = (Holder) convertView.getTag();
    }
    onBindViewHolder(holder, d, position, convertView);

    return convertView;
  }

  public abstract @LayoutRes int getLayoutId();

  /**
   * 创建Holder
   */
  public abstract Holder onCreateViewHolder(View convertView);

  /**
   * 绑定数据
   */
  public abstract void onBindViewHolder(Holder holder, D d, int position, View convertView);

  /**
   * 局部刷新的方法,如果不指明header个数,这里只考虑listView,其余按0处理
   *
   * @param parent AdapterView
   * @param position 需要刷新的position,这里的position不包含header
   */
  public void updateItem(AdapterView parent, int position) {
    int headerCount = 0;
    if (parent instanceof ListView) {
      headerCount = ((ListView) parent).getHeaderViewsCount();
    }
    updateItem(parent, position, headerCount);
  }
  /**
   * 局部刷新的方法
   *
   * @param parent AdapterView
   * @param position 需要刷新的position,这里的position不包含header
   * @param headerCount header个数
   */
  public void updateItem(AdapterView parent, int position, int headerCount) {
    int realPosition = position + headerCount;
    int firstVisiblePosition = parent.getFirstVisiblePosition();
    int lastVisiblePosition = parent.getLastVisiblePosition();
    // 判断position是否可见,如果可见调用updateUI方法
    if (realPosition >= firstVisiblePosition && realPosition <= lastVisiblePosition) {
      View view = parent.getChildAt(realPosition - firstVisiblePosition);
      onBindViewHolder((Holder) view.getTag(), getItem(position), position, null);
    }
  }

  /**
   * 这里忽略header
   * @param parent
   * @param position
   * @return
   */
  public Holder getItemHolder(AdapterView parent, int position){
    return (Holder) parent.getChildAt(position).getTag();
  }

  public void setDatas(@Nullable List<D> infos) {
    mInfos = infos;
    notifyDataSetChanged();
  }

  public List<D> getDatas() {
    return mInfos;
  }

  public boolean isEmpty() {
    return mInfos == null;
  }

  public void add(D t) {
    synchronized (mLock) {
      if (isEmpty()) {
        return;
      }
      mInfos.add(t);
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }

  public void addAll(List<D> list) {
    synchronized (mLock) {
      if (isEmpty()) {
        return;
      }
      if (list != null) {
        mInfos.addAll(list);
      }
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }

  public void clear() {
    if (isEmpty()) {
      return;
    }
    synchronized (mLock) {
      mInfos.clear();
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }
  public void remove(D t){
    synchronized (mLock){
      if(isEmpty()){
        return;
      }
      if(mInfos != null){
        mInfos.remove(t);
      }
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }
  public void insert(D t, int index){
    synchronized (mLock){
      if(isEmpty()){
        return;
      }
      if(mInfos != null){
        mInfos.add(index,t);
      }
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }

  public void sort(Comparator<? super D> comparator){
    synchronized (mLock){
      if(isEmpty()){
        return;
      }
      if(mInfos != null){
        Collections.sort(mInfos, comparator);
      }
    }
    if (mNotifyOnChange) notifyDataSetChanged();
  }
}
打开App,阅读手记
8人推荐
发表评论
随时随地看视频慕课网APP

热门评论

能告诉我这个菜鸡,这么用的万能看着好像吊炸天的适配器吗?


后续会继续完善,从代码抽象

查看全部评论