RecycleView 作為新出的控件.他規(guī)范了 Viewholder 的寫(xiě)法.
但是總感覺(jué)適配器的寫(xiě)法過(guò)于冗長(zhǎng).怎么辦呢?
我們來(lái)簡(jiǎn)化他.
ViewHolder 的實(shí)現(xiàn)方式和ListView適配器的超省寫(xiě)法中的ViewHodler 是一樣的
ViewHolder.class
public class ViewHolder { private SparseArray<View> viewHolder; private View view; public static ViewHolder getViewHolder(View view){ ViewHolder viewHolder = (ViewHolder) view.getTag(); if (viewHolder == null) { viewHolder = new ViewHolder(view); view.setTag(viewHolder); } return viewHolder; } private ViewHolder(View view) { this.view = view; viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } public <T extends View> T get(int id) { View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; } public View getConvertView() { return view; } public TextView getTextView(int id) { return get(id); } public Button getButton(int id) { return get(id); } public ImageView getImageView(int id) { return get(id); } public void setTextView(int id,CharSequence charSequence){ getTextView(id).setText(charSequence); }}
我們繼承 RecyclerView.Adapter<RVHolder>
AutoRVAdapter.class
public abstract class AutoRVAdapter extends RecyclerView.Adapter<RVHolder> { public List<?> list; private Context context; public AutoRVAdapter(Context context, List<?> list) { this.list = list; this.context = context; } @Override public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(onCreateViewLayoutID(viewType), null); return new RVHolder(view); } public abstract int onCreateViewLayoutID(int viewType); @Override public void onViewRecycled(final RVHolder holder) { super.onViewRecycled(holder); } @Override public void onBindViewHolder(final RVHolder holder, final int position) { onBindViewHolder(holder.getViewHolder(), position); if (onItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(null, v, holder.getPosition(), holder.getItemId()); } }); } } public abstract void onBindViewHolder(ViewHolder holder, int position); @Override public int getItemCount() { return list.size(); } private AdapterView.OnItemClickListener onItemClickListener; public AdapterView.OnItemClickListener getOnItemClickListener() { return onItemClickListener; } public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; }}
RVHolder.class 繼承 RecyclerView.ViewHolder
public class RVHolder extends RecyclerView.ViewHolder { private ViewHolder viewHolder; public RVHolder(View itemView) { super(itemView); viewHolder=ViewHolder.getViewHolder(itemView); } public ViewHolder getViewHolder() { return viewHolder; }}
到此,結(jié)束了
我們新寫(xiě)的適配器繼承AutoRVAdapter 實(shí)現(xiàn)onCreateViewLayoutID 和 onBindViewHolder 方法即可.onCreateViewLayoutID
->返回item 的布局.onBindViewHolder
->綁定數(shù)據(jù)源.
public class DemoRVAdapter extends AutoRVAdapter { public RecyclerAdapter(Context context, List<?> list) { super(context, list); } @Override public int onCreateViewLayoutID(int viewType) { return R.layout.item; } @Override public void onBindViewHolder(ViewHolder holder, int position) { Entity item=(Entity) list.get(position); vh.getTextView(R.id.name).setText(item.getName()); vh.getTextView(R.id.age).setText(item.getAge()); vh.setText(R.id.height,item.getHeight()); }}
聯(lián)系客服