項目地址: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