打造萬能適配器 (80行-25行代碼)極限優(yōu)化

極限.jpg

android中像是ListView和girdview 這種組件在項目中使用頻率非常高, adapter 也是每次必寫的玩意 合理的封裝 優(yōu)化 可以使得我們的寫更少的代碼 做更多的事情.

以下文章闡述了如何從80行代碼 優(yōu)化到 25行

ViewHolder 優(yōu)化

傳統(tǒng)的ViewHolder 一般都在自定義的adapter去編寫,并且每一個adapter都會對應(yīng)一個自定義的內(nèi)部類viewholder.

MyAdapter 中 viewHolder 部分代碼:
<pre>
private class ViewHolder{

    TextView  userName;
    TextView  userAge;
    TextView  userAddress;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    if(convertView == null){
        convertView = mInflater.inflate(this.layout,parent,false);
        holder = new ViewHolder();

        holder.userName = (TextView) convertView.findViewById(R.id.user_name);
        holder.userAge = (TextView) convertView.findViewById(R.id.user_age);
        holder.userAddress = (TextView) convertView.findViewById(R.id.user_address);

        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

</pre>

優(yōu)化方案 : 將各零散 viewHolder 抽象成一個通用類 適配所有自定義的adapter 并且viewHolder的相關(guān)業(yè)務(wù) 從adapter中 放到 通用viewHolder中.

抽象之后 使用通用viewHolder <b>1</b>行代碼
<pre>

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.get(context, convertView, parent, position, layout);
return viewHolder.getConvertView();
}

</pre>

獲得控件我們就可以用通用類中封裝好的方法getView(int id)
<pre>
TextView textView = viewHolder.getView(R.id.user_name);
</pre>

以下 ViewHolder 公共類 :
<pre>
/**

  • 抽象公共的viewholder

  • Created by sherlock on 15/12/17.
    */
    public class ViewHolder {

    private SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;

    public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
    this.mPosition = position;
    this.mViews = new SparseArray<>();
    this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);

     mConvertView.setTag(this);
    

    }

    /**

    • 獲取viewholder
    • @param context
    • @param converView
    • @param parent
    • @param position
    • @param layoutId
    • @return
      */
      public static ViewHolder get(Context context, View converView, ViewGroup parent, int position, int layoutId) {
      if (converView == null) {
      return new ViewHolder(context, parent, layoutId, position);
      } else {
      ViewHolder holder = (ViewHolder) converView.getTag();
      //viewholderr會被復(fù)用 及時更新下position
      holder.mPosition = position;
      return holder;
      }
      }
/**
 * 取得viewholder存儲的的控件
 * @param viewId
 * @param <T>
 * @return
 */
public <T extends View> T getView(int viewId) {
    View view = mViews.get(viewId);
    if(view == null){
        view = mConvertView.findViewById(viewId);
        mViews.put(viewId,view);
    }

    return (T) view;
}


public View getConvertView() {
    return mConvertView;
}

}

</pre>

Adapter優(yōu)化

我們建立一個CommonAdapter 繼承自BaseAdapter

<pre>

public abstract class CommonAdapter<T> extends BaseAdapter {

protected LayoutInflater mInflater;
protected int layout;
protected Context context;
protected List<T> dataList;

public CommonAdapter(Context context, int layout, List<T> dataList) {
    this.context = context;
    this.layout = layout;
    this.dataList = dataList;
    this.mInflater.from(context);
}

@Override
public int getCount() {
    return dataList.size();
}

@Override
public T getItem(int position) {
    return dataList.get(position);
}

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

@Override
public abstract  View  getView(int position, View convertView, ViewGroup parent);

}

</pre>

使用commonAdapter,代碼是不是精簡很多 我們還可以繼續(xù)優(yōu)化:
<pre>
public class MyAdapter extends CommonAdapter<User> {

public MyAdapter(Context context, int layout,List<User> dataList) {
    super(context,layout,dataList);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = ViewHolder.get(context, convertView, parent, position, layout);
    //使用
    TextView textView = viewHolder.getView(R.id.user_name);
    return viewHolder.getConvertView();
}

}

</pre>

我可以做到讓使用者更加專注他們的業(yè)務(wù), 可以將
ViewHolder viewHolder = ViewHolder.get(context, convertView, parent, position, layout);
return viewHolder.getConvertView();
兩部分代碼 繼續(xù)封裝 復(fù)用

在CommonAdapter中加入 一個抽象方法
public abstract void convert(ViewHolder holder,T t);
在commonAdapter中實現(xiàn)getView
<pre>

@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder viewHolder = ViewHolder.get(context, convertView, parent, position, layout);
convert(viewHolder,getItem(position));
return viewHolder.getConvertView();
}
</pre>

我們的MyAdapter來實現(xiàn)convert 這個部分就是暴露給 使用者的部分 在這里可以拿到一個holde如和 對應(yīng)業(yè)務(wù)bean的倆個對象 讓你專注填業(yè)務(wù)

超級清爽
<pre>
public class MyAdapter extends CommonAdapter<User> {

public MyAdapter(Context context, int layout,List<User> dataList) {
    super(context,layout,dataList);
}

@Override
public void convert(ViewHolder holder, User user) {
    //使用
    TextView textView = holder.getView(R.id.user_name);
    textView.setText(user.getUserName());
}

}
</pre>

極限優(yōu)化 1行代碼

我們可以通過鏈?zhǔn)秸{(diào)用來實現(xiàn)這個效果,我們在ViewHolder中 寫2個輔助方法

<pre>
public ViewHolder setText(int viewId,String text){
TextView textView = getView(viewId);
textView.setText(text);
return this;
}

public ViewHolder setImageResource(int viewId,int resId){
ImageView imageView = getView(viewId);
imageView.setImageResource(resId);
return this;
}
</pre>

可以根據(jù)你的控件情況 來封裝不同的方法.

使用起來很easy了 呵呵 真的一行足矣
<pre>

public class MyAdapter extends CommonAdapter<User> {

public MyAdapter(Context context, int layout, List<User> dataList) {
    super(context, layout, dataList);
}

@Override
public void convert(ViewHolder holder, User user) {
    holder  .setText(R.id.user_name, user.getUserName())
            .setText(R.id.user_age, user.getUserAge())
            .setText(R.id.user_address, user.getUserAddress());

}

}
</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容