一個適用于ListView/GridView/RecyclerView的Adapter庫

  • 簡化大量重復代碼
  • 支持多布局
  • 自定義圖片加載
  • 常用數據操作
  • view復用
  • RecyclerView item 點擊和長按事件

一個適用于ListView/GridView/RecyclerView的Adapter庫 一個適用于ListView/GridView/RecyclerView的Adapter庫 一個適用于ListView/GridView/RecyclerView的Adapter庫

gradle依賴

dependencies {
    compile 'com.classic.adapter:commonadapter:1.1'
    //項目中使用到RecyclerView,需要添加依賴
    compile 'com.android.support:recyclerview-v7:23.2.1'
}

開始使用

ListView/GridView 使用示例

List<News> newsList = ...;
//單布局文件
listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(new CommonAdapter<News>(context,
    //item布局文件
    R.layout.item_none_picture, newsList ) {
    @Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {
        //BaseAdapterHelper詳細用法,見下方

    helper.setText(R.id.xxx, item.getTitle())
           //可實現ImageLoad接口,進行圖片自定義加載方式,demo里面使用的Glide
          .setImageLoad(new GlideImageLoad())
          .setImageUrl(R.id.xxx,item.getCoverUrl());
}

});

//多布局文件 private final class MultipleLayoutAdapter extends CommonAdapter<News>{

public MultipleLayoutAdapter(Context context, int layoutResId, List<News> data) {
    super(context, layoutResId, data);
}
//多種布局重寫此方法即可
@Override public int getLayoutResId(News item) {
    int layoutResId = -1;
    switch (item.getNewsType()){
        case News.TYPE_NONE_PICTURE: //布局樣式一
            layoutResId = R.layout.item_none_picture;
            break;
        case News.TYPE_SINGLE_PICTURE: //布局樣式二
            layoutResId = R.layout.item_single_picture;
            break;
        case News.TYPE_MULTIPLE_PICTURE: //布局樣式三
            layoutResId = R.layout.item_multiple_picture;
            break;

        更多的布局樣式 ...
    }
    return layoutResId;
}

@Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {
    helper.setImageLoad(new GlideImageLoad());
    switch (item.getNewsType()){
        case News.TYPE_NONE_PICTURE: //布局樣式一
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;
        case News.TYPE_SINGLE_PICTURE: //布局樣式二
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;
        case News.TYPE_MULTIPLE_PICTURE: //布局樣式三
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;

        更多的布局樣式 ...
    }
}

}</code></pre>

RecyclerView 使用示例

List<News> newsList = ...;
//單布局文件
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new DefaultItemAnimator());
newsAdapter = new NewsAdapter(this, R.layout.item_none_picture, newsList);
recyclerView.setAdapter(newsAdapter);

private class NewsAdapter extends CommonRecyclerAdapter<News>{

public NewsAdapter(Context context, int layoutResId, List<News> data) {
    super(context, layoutResId, data);
}

@Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {
    helper.setText(R.id.xxx, item.getTitle())
          .setImageLoad(new GlideImageLoad())
          .setImageUrl(R.id.xxx,item.getCoverUrl());
}

}

//多布局文件 private final class MultipleLayoutAdapter extends CommonRecyclerAdapter<News>{

public MultipleLayoutAdapter(Context context, int layoutResId, List<News> data) {
    super(context, layoutResId, data);
}
//多種布局重寫此方法即可
@Override public int getLayoutResId(News item) {
    int layoutResId = -1;
    switch (item.getNewsType()){
        case News.TYPE_NONE_PICTURE: //布局樣式一
            layoutResId = R.layout.item_none_picture;
            break;
        case News.TYPE_SINGLE_PICTURE: //布局樣式二
            layoutResId = R.layout.item_single_picture;
            break;
        case News.TYPE_MULTIPLE_PICTURE: //布局樣式三
            layoutResId = R.layout.item_multiple_picture;
            break;

        更多的布局樣式 ...
    }
    return layoutResId;
}

@Override public void onUpdate(BaseAdapterHelper helper, News item, int position) {
    helper.setImageLoad(new GlideImageLoad());
    switch (item.getNewsType()){
        case News.TYPE_NONE_PICTURE: //布局樣式一
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;
        case News.TYPE_SINGLE_PICTURE: //布局樣式二
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;
        case News.TYPE_MULTIPLE_PICTURE: //布局樣式三
            helper.setText(R.id.xxx, item.getTitle())
                  .setImageUrl(R.id.xxx,item.getCoverUrl());
            break;

        更多的布局樣式 ...
    }
}

}</code></pre>

RecyclerView item點擊事件和長按事件

commonRecyclerAdapter.setOnItemClickListener(new CommonRecyclerAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(RecyclerView.ViewHolder viewHolder, View view, int position) {
        // TODO ...
    }
});
commonRecyclerAdapter.setOnItemLongClickListener(new CommonRecyclerAdapter.OnItemLongClickListener() {
    @Override public void onItemLongClick(RecyclerView.ViewHolder viewHolder, View view,
        int position) {
        // TODO ...
    }
});

CommonAdapter、CommonRecyclerAdapter區別

CommonAdapter適用于:ListView/GridView
CommonRecyclerAdapter適用于:RecyclerView
使用方式都一樣

BaseAdapterHelper 使用示例

helper.setText(R.id.viewId, text)
      .setTag(R.id.viewId, objectTag)
      .setAlpha(R.id.viewId, 0.6f)
      .setBackgroundColor(R.id.viewId, R.color.colorResId)
      .setBackgroundRes(R.id.viewId, R.drawable.drawableResId)
      .setChecked(R.id.viewId, true)
      .setImageBitmap(R.id.viewId,bitmap)
      .setImageDrawable(R.id.viewId,drawable)
      .setImageResource(R.id.viewId, R.drawable.drawableResId)
      .setImageUrl(R.id.viewId, url)
      .setProgress(R.id.viewId,progress)
      .setProgress(R.id.viewId,progress,max)
      .setRating(R.id.viewId, rating)
      .setRating(R.id.viewId, rating, max)
      .setTextColor(R.id.viewId, R.color.colorResId)
      .setTextColorRes(R.id.viewId, R.color.colorResId)
      //單個TextView設置Typeface
      .setTypeface(R.id.viewId, typeface)
      //多個TextView設置Typeface
      .setTypeface(typeface, R.id.xxx1, R.id.xxx2,R.id.xxx3, ...)
      .setVisible(R.id.viewId, View.VISIBLE)
      //ProgressBar設置Max
      .setMax(R.id.viewId, max)
      //ListView設置adapter
      .setAdapter(R.id.viewId, adapter)
      //下面為View常用點擊事件設置
      .setOnTouchListener(R.id.viewId, View.OnTouchListener)
      .setOnClickListener(R.id.viewId, View.OnClickListener)
      .setOnLongClickListener(R.id.viewId, View.OnLongClickListener)
      .setOnItemClickListener(R.id.viewId, AdapterView.OnItemClickListener)
      .setOnItemLongClickListener(R.id.viewId, AdapterView.OnItemLongClickListener)
      .setOnItemSelectedClickListener(R.id.viewId, AdapterView.OnItemSelectedListener);

//獲取item的convertView View convertView = helper.getView();

//如果上面的屬性不夠用,可以通過getView(viewId)拿到View,然后進行屬性設置 View childView = helper.getView(R.id.viewId); </code></pre>

自定義圖片加載

public class YourXXX implements ImageLoad {

@Override public void load(Context context, ImageView imageView, String imageUrl) {

    //使用Glide加載圖片
    Glide.with(context).load(imageUrl).into(imageView);

    or

    //使用Picasso加載圖片
    Picasso.with(context).load(url).into(imageView);

    or

    fresco
    Android-Universal-Image-Loader
    其它自定義
    ...
}

}</code></pre>

注意事項

//加載網絡圖片之前,請調用setImageLoad方法,設置網絡圖片加載的實現類
helper.setImageLoad(new GlideImageLoad());
helper.setImageUrl(R.id.xxx,url);

常用的數據操作

//CommonAdapter、CommonRecyclerAdapter都實現了IData接口,里面包含了一些常用的數據操作

void add(T elem);

void addAll(List<T> elem);

void set(T oldElem, T newElem);

void set(int index, T elem);

void remove(T elem);

void remove(int index);

void replaceAll(List<T> elem);

boolean contains(T elem);

void clear(); </code></pre>

感謝

base-adapter-helper

 本文由用戶 BethanyAcun 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!