一个适用于ListView/GridView/RecyclerView的Adapter库

BethanyAcun 8年前
   <ul>     <li>简化大量重复代码</li>     <li>支持多布局</li>     <li>自定义图片加载</li>     <li>常用数据操作</li>     <li>view复用</li>     <li>RecyclerView item 点击和长按事件</li>    </ul>    <p><a href="/misc/goto?guid=4959671487567792792"><img alt="一个适用于ListView/GridView/RecyclerView的Adapter库" src="https://simg.open-open.com/show/c15a156f1cbad144f1cdc7032ee0d66d.png" width="240" height="426"></a> <a href="/misc/goto?guid=4959671487650475889"><img alt="一个适用于ListView/GridView/RecyclerView的Adapter库" src="https://simg.open-open.com/show/a293d46d01177f37b8942be59fd4adc7.png" width="240" height="426"></a> <a href="/misc/goto?guid=4959671487741552993"><img alt="一个适用于ListView/GridView/RecyclerView的Adapter库" src="https://simg.open-open.com/show/1aa331dd7ffa4b9c0698edd90d56e5e4.png" width="240" height="426"></a></p>    <h2>gradle依赖</h2>    <pre>  <code class="language-java">dependencies {      compile 'com.classic.adapter:commonadapter:1.1'      //项目中使用到RecyclerView,需要添加依赖      compile 'com.android.support:recyclerview-v7:23.2.1'  }</code></pre>    <h2>开始使用</h2>    <p>ListView/GridView 使用示例</p>    <pre>  <code class="language-java">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>    <p>RecyclerView 使用示例</p>    <pre>  <code class="language-java">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>    <p>RecyclerView item点击事件和长按事件</p>    <pre>  <code class="language-java">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 ...      }  });</code></pre>    <p>CommonAdapter、CommonRecyclerAdapter区别</p>    <pre>  <code class="language-java">CommonAdapter适用于:ListView/GridView  CommonRecyclerAdapter适用于:RecyclerView  使用方式都一样</code></pre>    <p>BaseAdapterHelper 使用示例</p>    <pre>  <code class="language-java">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>    <p>自定义图片加载</p>    <pre>  <code class="language-java">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>    <p>注意事项</p>    <pre>  <code class="language-java">//加载网络图片之前,请调用setImageLoad方法,设置网络图片加载的实现类  helper.setImageLoad(new GlideImageLoad());  helper.setImageUrl(R.id.xxx,url);</code></pre>    <p>常用的数据操作</p>    <pre>  <code class="language-java">//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>    <h2>感谢</h2>    <p><a href="/misc/goto?guid=4959644427404037414">base-adapter-helper</a></p>