项目地址:ingeniousadapter
前面的话:本项目的原型是QuickAdapter,它们的思路基本一致,但本项目的优点在于:git
在使用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