一、Adapter的封裝
由于我們的RecycleView在項目中很常用,因此有必要對Adapter進行封裝。
封裝的原則是:
BaseAdapter的代碼如下:
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * Adapter的簡單封裝 */ public abstract class BaseAdapter<T, H extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder> { protected static final String TAG = BaseAdapter.class.getSimpleName(); protected final Context context; protected final int layoutResId; protected List<T> datas; private OnItemClickListener mOnItemClickListener = null; public interface OnItemClickListener { void onItemClick(View view, int position); } public BaseAdapter(Context context, int layoutResId) { this(context, layoutResId, null); } public BaseAdapter(Context context, int layoutResId, List<T> datas) { this.datas = datas == null ? new ArrayList<T>() : datas; this.context = context; this.layoutResId = layoutResId; } @Override public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutResId, viewGroup, false); BaseViewHolder vh = newBaseViewHolder(view, mOnItemClickListener); return vh; } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { T item = getItem(position); convert((H) holder, item); } @Override public int getItemCount() { if (datas == null || datas.size() <= 0) return 0; return datas.size(); } public T getItem(int position) { if (position >= datas.size()) return null; return datas.get(position); } /** * 清空數(shù)據(jù) */ public void clearData() { int size = datas.size(); datas.clear(); notifyItemRangeRemoved(0, size); } /** * 下拉刷新,清除原有數(shù)據(jù),添加新數(shù)據(jù) * * @param newData */ public void refreshData(List<T> newData) { datas.clear(); datas.addAll(newData); notifyItemRangeChanged(0, datas.size()); } /** * 在原來數(shù)據(jù)的末尾追加新數(shù)據(jù) * * @param moreData */ public void loadMoreData(List<T> moreData) { int lastPosition = datas.size(); datas.addAll(lastPosition, moreData); notifyItemRangeInserted(lastPosition, moreData.size()); } /** * Implement this method and use the helperto adapt the view to the given item. * * @param viewHoder A fully initializedhelper. * @param item The item that needs to be displayed. */ protected abstract void convert(H viewHoder, T item); public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } }
BaseViewHolder的代碼如下:
import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; /** * 封裝的ViewHolder */ public class BaseViewHolder extendsRecyclerView.ViewHolder implements View.OnClickListener { //使用數(shù)組把條目中的View保存起來 private SparseArray<View> views; private BaseAdapter.OnItemClickListener mOnItemClickListener; public BaseViewHolder(ViewitemView, BaseAdapter.OnItemClickListener onItemClickListener) { super(itemView); itemView.setOnClickListener(this); this.mOnItemClickListener = onItemClickListener; this.views = new SparseArray<View>(); } public TextView getTextView(int viewId) { return retrieveView(viewId); } public Button getButton(int viewId) { return retrieveView(viewId); } public ImageView getImageView(int viewId) { return retrieveView(viewId); } public View getView(int viewId) { return retrieveView(viewId); } protected <T extends View> T retrieveView(int viewId) { View view = views.get(viewId); if (view == null) { view = itemView.findViewById(viewId); views.put(viewId, view); } return (T) view; } @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, getLayoutPosition()); } } } 為了使用方便,再提供一個SimpleAdapter: import android.content.Context; import java.util.List; /** * 一個簡易的adapter */ public abstract class SimpleAdapter<T> extends BaseAdapter<T, BaseViewHolder> { public SimpleAdapter(Context context, int layoutResId) { super(context, layoutResId); } public SimpleAdapter(Contextcontext, int layoutResId, List<T> datas) { super(context, layoutResId, datas); } }
二、封裝Adapter的基本使用 1、使用
mAdapter = newSimpleAdapter<Page.Ware>(getActivity(), R.layout.item_hot_wares) { @Override protected void convert(BaseViewHolder holder, final Page.Ware item) { SimpleDraweeView s = (SimpleDraweeView) holder.getView(R.id.drawee_view); s.setImageURI(Uri.parse(item.getImgUrl())); holder.getTextView(R.id.text_title).setText(item.getName()); holder.getTextView(R.id.text_price).setText(item.getPrice() + ""); holder.getButton(R.id.btn_add).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getActivity(), item.getName(), Toast.LENGTH_SHORT).show(); } }); } };
2、還可以進行點擊監(jiān)聽
mAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { } });
|