快速構建AdapterView的Adapter--ingeniousadapter

項目地址:ingeniousadapter

前面的話:本項目的原型是QuickAdapter,它們的思路基本一致,但本項目的優點在於:git

  • 支持AdapterView存在多個layout類型
  • 可配置圖片加載緩存庫

在使用AdapterView時,咱們須要使用Adapter來綁定數據源和AdapterView中的每一項數據。一般咱們繼承自BaseAdapter,而後重寫四個方法:github

public int getCount()

public Object getItem(int position) 

public long getItemId(int position)

public View getView(int position, View convertView, ViewGroup parent)

其中主要的邏輯實如今getView,這個方法主要完成兩步操做:一、生成(或者從緩存中取出)當前item對應的ItemView;二、將數據和ItemView綁定。一般,因爲AdapterView支持緩存機制(如ListView),咱們經過一個Holder來避免每一次getView重複的findViewById。緩存

private static class Holder {
    TextView tv_name;
    ImageView iv_avatar;
    .....
}

public View getView(int position, View convertView, ViewGroup parent) {
    Holder hodler = null;
    if(converView==null) {
        holder = new Holder();
         convertView = LayoutInflater.from(context)
            .inflate(layoutId, parent, false);
        holder.tv_name = (TextView) findViewById(R.id.tv_name);
        holder.iv_avatar = (ImageView) findViewById(R.id.iv_avatar);
        ...
        //下次就不須要findViewById了
        covertView.setTag(holder);
    }
    
    holder =(Holder) convertView.getTag();
    holder.tv_name.setText(***);
    holder.iv_avatar.set(***);
}

以上就是BaseAdapter的典型用法,那麼在項目裏面的全部Adapter都存在Holder,而且都存在holder.properties = (ViewType) findViewById(id)的重複代碼。能夠想象一下,若是Holder中有比較多的屬性,特別是若是一個AdapterView具備多個不一樣類型的layout,那麼也須要多個不一樣Holder,getView將會特別複雜。

geniousadapter對getView進行了一層封裝,並將getView函數的兩部分功能進行拆分,自動完成了生成ItemView和Holder的過程,經過一個抽象方法covert讓子類實現數據綁定。子類須要實現兩個抽象方法:ide

/**
  * 經過AdapterHolder填充view的屬性,這個函數主要完成數據綁定的過程,使用方法:
  * holder.setText(R.id.tv_name,"張三").setText(R.id.tv_nickName,
  * "三兒").setImageResource(R.id.iv_avatar,R.drawable.ic_user_avatar);
  * holder 
  * item 當前item須要綁定的數據
  */
  protected abstract void convert(AdapterHolder holder, T item,int viewType);

 /**
  * layoutid至數據類型的映射,插入順序對應itemviewtype
  * @return
  */
  protected abstract int[] assignLayoutIDs();

holder.setImageUrl(int,imageUrl)能夠經過使用者本身定義遠程圖片加載的方式。用戶能夠本身實現加載圖片或者使用第三方圖片加載緩存庫,其接口以下:函數

public interface ImageLoader {

public void load(ImageView imageView,String imageUrl);

//placeResId  默認圖resid
public void load(ImageView imageView,String imageUrl,int placeResId);
}

好比咱們可使用picasso來完成加載圖片的功能,在合適的位置來指定:ui

DefaultAdapterConfig.setImageLoader(new ImageLoader() {
    @Override
    public void load(ImageView imageView, String imageUrl) {
        picasso.load(imageUrl).into(imageView);
    }

    @Override
    public void load(ImageView imageView, String imageUrl, int placeResId) {
        picasso.load(imageUrl).placeholder(placeResId).into(imageView);
    }
});

總結:genious Adapter可使用戶在getView方法中無需關注每一項ItemView生成的細節,而只須要處理數據綁定的邏輯便可。code

相關文章
相關標籤/搜索