1.關於需求介紹git
2.簡單封裝【V1.0版本】github
2.4 如何使佈局多樣化編程
3.簡單封裝困境緩存
4.關於複雜界面封裝網絡
/** * ================================================ * 做 者:楊充 * 版 本:1.0 * 建立日期:2016/3/9 * 描 述:ViewHolder的抽取類 * 修訂歷史: * ================================================ */ public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { // SparseArray 比 HashMap 更省內存,在某些條件下性能更好,只能存儲 key 爲 int 類型的數據, // 用來存放 View 以減小 findViewById 的次數 private SparseArray<View> viewSparseArray; //這個是item的對象 private View mItemView; public BaseViewHolder(View itemView) { super(itemView); this.mItemView = itemView; itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); viewSparseArray = new SparseArray<>(); } /** * 根據 ID 來獲取 View * @param viewId viewID * @param <T> 泛型 * @return 將結果強轉爲 View 或 View 的子類型 */ public <T extends View> T getView(int viewId) { // 先從緩存中找,找打的話則直接返回 // 若是找不到則 findViewById ,再把結果存入緩存中 View view = viewSparseArray.get(viewId); if (view == null) { view = itemView.findViewById(viewId); viewSparseArray.put(viewId, view); } return (T) view; } /** * 獲取item的對象 */ public View getItemView(){ return mItemView; } /** * 設置TextView的值 */ public BaseViewHolder setText(int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } /** * 設置imageView圖片 */ public BaseViewHolder setImageResource(int viewId, int resId) { ImageView view = getView(viewId); view.setImageResource(resId); return this; } /** * 設置imageView圖片 */ public BaseViewHolder setImageBitmap(int viewId, Bitmap bitmap) { ImageView view = getView(viewId); view.setImageBitmap(bitmap); return this; } @Override public void onClick(View v) { if (commonClickListener != null) { commonClickListener.onItemClickListener(getAdapterPosition()); } } @Override public boolean onLongClick(View v) { if (commonClickListener != null) { commonClickListener.onItemLongClickListener(getAdapterPosition()); } return false; } public interface onItemCommonClickListener { void onItemClickListener(int position); void onItemLongClickListener(int position); } private onItemCommonClickListener commonClickListener; public void setCommonClickListener(onItemCommonClickListener commonClickListener) { this.commonClickListener = commonClickListener; } }
/** * ================================================ * 做 者:楊充 * 版 本:1.0 * 建立日期:2016/3/9 * 描 述:RecycleView的adapter抽取類 * 修訂歷史: * ================================================ */ public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> { private Context context; private int layoutId; private List<T> data; /** * 構造方法 * @param layoutId 佈局 * @param context 上下文 */ public BaseAdapter(Context context , int layoutId) { this.layoutId = layoutId; this.context = context; data = new ArrayList<>(); } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(layoutId, parent, false); return new BaseViewHolder(view); } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { if(data!=null && data.size()>0){ bindData(holder, data.get(position)); } } @Override public int getItemViewType(int position) { return super.getItemViewType(position); } @Override public int getItemCount() { return data==null ? 0 : data.size(); } /** * 當子類adapter繼承此BaseAdapter時,須要子類實現的綁定數據方法 */ protected abstract void bindData(BaseViewHolder holder, T t); /** * 設置數據,而且刷新頁面 */ public void setData(List<T> list){ data.clear(); if(list==null || list.size()==0){ return; } data.addAll(list); notifyItemRangeChanged(data.size()-list.size(),data.size()); notifyDataSetChanged(); } /** * 獲取數據 */ public List<T> getData(){ return data; } /** * 清理全部數據,而且刷新頁面 */ public void clear(){ data.clear(); notifyDataSetChanged(); } /** * 移除數據 */ public void remove(T t){ if(data.size()==0){ return; } int index = data.indexOf(t); remove(index); } /** * 移除數據 */ public void remove(int index){ if(data.size()==0){ return; } data.remove(index); notifyItemRemoved(index); } /** * 移除數據 */ public void remove(int start,int count){ if(data.size()==0){ return; } if((start +count) > data.size()){ return; } data.subList(start,start+count).clear(); notifyItemRangeRemoved(start,count); } }
public class SecondAdapter extends BaseAdapter<String> { private BaseViewHolder.onItemCommonClickListener commonClickListener; public SecondAdapter(Context context) { super(context,R.layout.item_first); } public SecondAdapter(Context context, BaseViewHolder.onItemCommonClickListener commonClickListener) { super(context, R.layout.item_first); this.commonClickListener = commonClickListener; } @Override protected void bindData(BaseViewHolder holder, String s) { holder.setText(R.id.tv_title,s); //TextView view = holder.getView(R.id.tv_title); //view.setText(s); holder.setCommonClickListener(commonClickListener); } }
public interface MultiTypeSupport<T> { int getLayoutId(T item, int position); }
@Override public int getItemViewType(int position) { if (multiTypeSupport != null) { return multiTypeSupport.getLayoutId(data.get(position), position); } return super.getItemViewType(position); } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (multiTypeSupport != null) { layoutId = viewType; } View view = LayoutInflater.from(context).inflate(layoutId, parent, false); return new BaseViewHolder(view); }
@Override public int getLayoutId(ThirdBean item, int position) { if (item.getLocation()==1) { return R.layout.main_chat_from_msg; } return R.layout.main_chat_send_msg; } public ThirdAdapter(Context context, BaseViewHolder.onItemCommonClickListener commonClickListener) { super(context, R.layout.main_chat_from_msg); this.commonClickListener = commonClickListener; this.multiTypeSupport = this; }
list = new ArrayList<>(); for(int a=0 ; a<13 ; a++){ if(a==3 || a==8 || a==10 || a==12){ list.get(a).setTitle("這個是假數據"+a); list.get(a).setLocation(1); }else { list.get(a).setTitle("這個是假數據"+a); list.get(a).setLocation(2); } }
前面,咱們能夠簡單實現不一樣佈局類型的。可是大多數的App首頁都是比較複雜的,好比一個社交APP的首頁,包含Banner區、廣告區、文本內容、圖片內容、視頻內容等等。RecyclerView 能夠用ViewType 來區分不一樣的item,也能夠知足需求 ,但仍是存在一些問題。ide
public class FourAdapter extends BaseAdapter<FourBean> implements MultiTypeSupport<FourBean>{ public FourAdapter(Context context) { super(context, R.layout.main_chat_from_msg); //這句話一點要添加 this.multiTypeSupport = this; } @Override protected void bindData(BaseViewHolder holder, FourBean s) { int location = s.getLocation(); switch (location){ case 1: //處理頭部佈局邏輯 holder.setText(R.id.tv_title,s.getTitle()); break; case 2: //文本邏輯處理 holder.setText(R.id.tv_title,s.getTitle()); break; case 3: //圖片邏輯處理 holder.setText(R.id.tv_title,s.getTitle()); break; case 4: //處理底部佈局邏輯 holder.setText(R.id.tv_title,s.getTitle()); break; } } @Override public int getLayoutId(FourBean item, int position) { if (item.getLocation()==1) { return R.layout.main_chat_from_msg; }else if(item.getLocation()==2){ return R.layout.item_first; } else if(item.getLocation()==4){ return R.layout.view_footer; } return R.layout.main_chat_send_msg; } }
。具體使用方法,能夠直接參考demo。**函數