RecyclerView适配器的超省写法

移动开发
RecycleView 作为新出的控件.他规范了 Viewholder 的写法.但是总感觉适配器的写法过于冗长.怎么办呢?

[[144456]]

RecycleView 作为新出的控件.他规范了 Viewholder 的写法.

但是总感觉适配器的写法过于冗长.怎么办呢?

我们来简化他.

ViewHolder 的实现方式和ListView适配器的超省写法中的ViewHodler 是一样的

ViewHolder.class

  1. public class ViewHolder { 
  2.     private SparseArray<View> viewHolder; 
  3.     private View view; 
  4.  
  5.     public static  ViewHolder getViewHolder(View view){ 
  6.         ViewHolder viewHolder = (ViewHolder) view.getTag(); 
  7.         if (viewHolder == null) { 
  8.             viewHolder = new ViewHolder(view); 
  9.             view.setTag(viewHolder); 
  10.         } 
  11.         return viewHolder; 
  12.     } 
  13.     private ViewHolder(View view) { 
  14.         this.view = view; 
  15.         viewHolder = new SparseArray<View>(); 
  16.         view.setTag(viewHolder); 
  17.     } 
  18.     public <T extends View> T get(int id) { 
  19.         View childView = viewHolder.get(id); 
  20.         if (childView == null) { 
  21.             childView = view.findViewById(id); 
  22.             viewHolder.put(id, childView); 
  23.         } 
  24.         return (T) childView; 
  25.     } 
  26.  
  27.     public View getConvertView() { 
  28.         return view; 
  29.     } 
  30.  
  31.     public TextView getTextView(int id) { 
  32.  
  33.         return get(id); 
  34.     } 
  35.     public Button getButton(int id) { 
  36.  
  37.         return get(id); 
  38.     } 
  39.  
  40.     public ImageView getImageView(int id) { 
  41.         return get(id); 
  42.     } 
  43.  
  44.     public void setTextView(int  id,CharSequence charSequence){ 
  45.         getTextView(id).setText(charSequence); 
  46.     } 
  47.  

我们继承 RecyclerView.Adapter<RVHolder>

AutoRVAdapter.class

  1. public abstract class AutoRVAdapter extends RecyclerView.Adapter<RVHolder> { 
  2.  
  3.  
  4.     public List<?> list; 
  5.  
  6.     private Context context; 
  7.  
  8.     public AutoRVAdapter(Context context, List<?> list) { 
  9.         this.list = list; 
  10.         this.context = context; 
  11.     } 
  12.  
  13.     @Override 
  14.     public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  15.         View view = LayoutInflater.from(context).inflate(onCreateViewLayoutID(viewType), null); 
  16.  
  17.         return new RVHolder(view); 
  18.     } 
  19.  
  20.     public abstract int onCreateViewLayoutID(int viewType); 
  21.  
  22.  
  23.     @Override 
  24.     public void onViewRecycled(final RVHolder holder) { 
  25.         super.onViewRecycled(holder); 
  26.     } 
  27.  
  28.     @Override 
  29.     public void onBindViewHolder(final RVHolder holder, final int position) { 
  30.  
  31.         onBindViewHolder(holder.getViewHolder(), position); 
  32.         if (onItemClickListener != null) { 
  33.             holder.itemView.setOnClickListener(new View.OnClickListener() { 
  34.                 @Override 
  35.                 public void onClick(View v) { 
  36.                     onItemClickListener.onItemClick(null, v, holder.getPosition(), holder.getItemId()); 
  37.                 } 
  38.             }); 
  39.         } 
  40.  
  41.     } 
  42.  
  43.     public abstract void onBindViewHolder(ViewHolder holder, int position); 
  44.  
  45.     @Override 
  46.     public int getItemCount() { 
  47.         return list.size(); 
  48.     } 
  49.  
  50.     private AdapterView.OnItemClickListener onItemClickListener; 
  51.  
  52.     public AdapterView.OnItemClickListener getOnItemClickListener() { 
  53.         return onItemClickListener; 
  54.     } 
  55.  
  56.     public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) { 
  57.         this.onItemClickListener = onItemClickListener; 
  58.     } 

RVHolder.class 继承 RecyclerView.ViewHolder

  1. public class RVHolder  extends RecyclerView.ViewHolder { 
  2.  
  3.  
  4.     private ViewHolder viewHolder; 
  5.  
  6.     public RVHolder(View itemView) { 
  7.         super(itemView); 
  8.         viewHolder=ViewHolder.getViewHolder(itemView); 
  9.     } 
  10.  
  11.  
  12.     public ViewHolder getViewHolder() { 
  13.         return viewHolder; 
  14.     } 
  15.  

到此,结束了

我们新写的适配器继承AutoRVAdapter 实现onCreateViewLayoutID 和 onBindViewHolder 方法即可.

onCreateViewLayoutID->返回item 的布局.

onBindViewHolder->绑定数据源.

  1. public class DemoRVAdapter extends AutoRVAdapter { 
  2.     public RecyclerAdapter(Context context, List<?> list) { 
  3.         super(context, list); 
  4.     } 
  5.  
  6.     @Override 
  7.     public int onCreateViewLayoutID(int viewType) { 
  8.         return R.layout.item; 
  9.     } 
  10.  
  11.     @Override 
  12.     public void onBindViewHolder(ViewHolder holder, int position) { 
  13.  
  14.         Entity item=(Entity) list.get(position); 
  15.         vh.getTextView(R.id.name).setText(item.getName()); 
  16.         vh.getTextView(R.id.age).setText(item.getAge()); 
  17.         vh.setText(R.id.height,item.getHeight());  
  18.     } 

 

责任编辑:倪明 来源: 简书
相关推荐

2012-09-19 15:29:26

Worklight适配器

2018-10-11 10:38:31

前端JavaScript编程语言

2022-02-18 17:21:29

适配器模式客户端

2020-10-25 08:56:21

适配器模式

2011-04-28 09:54:50

jQuery

2022-02-13 23:33:24

设计模式Java

2021-08-06 06:51:16

适配器配置Spring

2021-02-16 08:16:09

适配器模式MybatisJava

2009-12-21 10:26:09

Oracle适配器

2012-05-16 17:22:11

Java设计模式

2009-11-18 18:08:20

PHP适配器模式

2021-02-18 08:39:28

设计模式场景

2013-11-26 16:39:21

Android设计模式

2010-07-09 12:53:30

HART协议

2012-08-02 10:46:34

JavaAdapter模式

2014-12-17 09:57:01

AndroidAdapteViewHolder

2013-02-26 10:55:47

C#适配器设计模式

2010-09-02 17:04:52

DHCP服务器

2012-12-10 10:53:04

IBMdW

2010-12-23 13:56:34

网络适配器
点赞
收藏

51CTO技术栈公众号