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。**函数