打造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 extends BaseAdapter{  private List 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 infos) {    mInfos = infos;    notifyDataSetChanged();  }  public List 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 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();  }}

更多相关文章

  1. Android官方使低版本系统(2.1)支持ActionBar的方法
  2. Androi与html中的JavaScript之间方法相互调用
  3. 【Android】Android中Button的OnClickListener实现方法
  4. Android webview中定制js的alert,confirm和prompt对话框的方法 (
  5. Android 性能优化的一些方法(转)
  6. 消除“Unfortunately, System UI has stopped”的方法

随机推荐

  1. Android(安卓)Studio中使用开源库volley
  2. Android(安卓)设计模式之原型模式
  3. Android中实现长按照片弹出右键菜单
  4. Android(安卓)计算方法运行时间
  5. 在AndroidStudio中出现android no debugg
  6. Android-ListView中嵌套(ListView)控件时
  7. Uni-app Android(安卓)离线打包集成 uni-
  8. Android(安卓)Studio 2.2 预览版 - 全新
  9. ViewPager + Fragment + RecyclerView 切
  10. "Kernel version" 中编译时间的前世今生