转自:http://www.cnblogs.com/wjtaigwh/p/6039929.html
1,用了很长一段时间的RecyclerView,在项目中用的频率也越来越频繁(因为踩得坑也越来越多了),或过头来看,感觉一直在写RecyclerView.Adapter中的三个方法和一个内部类,感觉很浪费时间,那么今天我们来试着封装封装,来减少我们的使用
先看一下我们的实现效果:
2,我们来简单的写一写吧,首先我们按照以前的方式写的话,看看有哪些代码,我们先来发出来看看
UserSimpleRecyclerAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package com.qianmo.myview2.base; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.qianmo.myview2.R; import com.qianmo.myview2.bean.UserBean; import org.w3c.dom.Text; import java.util.List; /** * Created by wangjitao on 2016/11/7 0007. */ public class UserSimpleRecycleAdapter extends RecyclerView.Adapter<UserSimpleRecycleAdapter.ViewHolder> { private Context context; private LayoutInflater inflater; private List<UserBean> datas; public UserSimpleRecycleAdapter(Context context, List<UserBean> datas) { this .context = context; this .inflater = LayoutInflater.from(context); this .datas = datas; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = inflater.inflate(R.layout.item_user, parent, false ); ViewHolder holder = new ViewHolder(itemView); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.tv_name.setText(datas.get(position).getName()); holder.tv_age.setText(datas.get(position).getAge()); } @Override public int getItemCount() { return datas == null ? 0 : datas.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView tv_name; TextView tv_age; public ViewHolder(View itemView) { super (itemView); tv_name = (TextView) itemView.findViewById(R.id.tv_name); tv_age = (TextView) itemView.findViewById(R.id.tv_age); } } } |
可以看到 getItemCount()、onCreateViewHolder()、onBindViewHolder()再加上ViewHolder内部类是我们必须要写的,但是写长了我们就可以感觉到 getItemCount()是基本上代码相同的,一般在onCreateViewHolder中创建ViewHolder,在onBindViewHolder中写数据和逻辑 ,而我们程序员最管关心什么呢 就是数据和逻辑的处理啊 ,如果我们创建一个适配器只用写我们的逻辑的话,那我们每天都可以省下好多时间来打一把lol了,现在带大家一步一步封装吧!
首先看一下我们最关键的BaseViewHolder
BaseViewHolder.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.qianmo.myview2.base; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; /** * Created by wangjitao on 2016/11/7 0007. * 万能的Viewholder */ public class BaseViewHolder extends RecyclerView.ViewHolder { private SparseArray<View> views; public BaseViewHolder(View view) { super (view); this .views = new SparseArray<>(); } public <T extends View> T getView( int viewId) { View view = views.get(viewId); if (view == null ) { view = itemView.findViewById(viewId); views.put(viewId, view); } return (T) view; } public View getRootView() { return itemView; } } |
其实里面重要的就是views属性和getView()方法 ,getView方法中用户通过传递控件的id然后首先会去views这个集合中去拿,如果没有的话说明是我们的头部,这样就解决了多次findView的问题,好像里面也没什么难懂的,大家就看看吧。
再看一下我们的抽象类BaseRecycleViewAdapter
BaseRecycleViewAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package com.qianmo.myview2.base; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.balysv.materialripple.MaterialRippleLayout; import com.qianmo.myview2.R; import java.util.List; /** * Created by wangjitao on 2016/11/7 0007. * 对简单的recycleview进行简单的封装 */ public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> { private Context context; private LayoutInflater inflater; private List<T> datas; private int layoutId; protected OnItemClickListner onItemClickListner; //单击事件 protected OnItemLongClickListner onItemLongClickListner; //长按单击事件 private boolean clickFlag = true ; //单击事件和长单击事件的屏蔽标识 public BaseRecyclerViewAdapter(Context context, List<T> datas, int layoutId) { this .context = context; this .datas = datas; this .layoutId = layoutId; this .inflater = LayoutInflater.from(context); } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { BaseViewHolder holder = new BaseViewHolder(inflater.inflate(layoutId, parent, false )); MaterialRippleLayout.on(holder.getView(R.id.ll_all)) .rippleOverlay( true ) .rippleAlpha( 0 .2f) .rippleColor(context.getResources().getColor(R.color.colorAccent)) .rippleHover( true ) .create(); return holder; } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { bindData(holder, datas.get(position), position); } @Override public int getItemCount() { return datas == null ? 0 : datas.size(); } protected abstract void bindData(BaseViewHolder holder, T data, int position); public void setOnItemClickListner(OnItemClickListner onItemClickListner) { this .onItemClickListner = onItemClickListner; } public void setOnItemLongClickListner(OnItemLongClickListner onItemLongClickListner) { this .onItemLongClickListner = onItemLongClickListner; } public interface OnItemClickListner { void onItemClickListner(View v, int position); } public interface OnItemLongClickListner { void onItemLongClickListner(View v, int position); } } |
我们在里面处理了onCreateViewHolder和getItemCount这两个我们一直写的方法,通过抽象方法把我们最重要的onBindViewHolder方法暴露出去,这样我们就可以在暴露出去的bindData()方法中去处理逻辑了,并且添加了创建的Item点击事件和长按事件。
我们写一个简单的用户展示列表看看效果如何,创建UserAdapter.java,看一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.qianmo.myview2.base; import android.content.Context; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.qianmo.myview2.R; import com.qianmo.myview2.bean.UserBean; import java.util.List; /** * Created by Administrator on 2016/11/7 0007. */ public class UserAdapter extends BaseRecyclerViewAdapter<UserBean> { public UserAdapter(Context context, List<UserBean> datas, int layoutId) { super (context, datas, layoutId); } @Override protected void bindData( final BaseViewHolder holder, UserBean data, final int position) { LinearLayout ll_all = (LinearLayout) holder.getView(R.id.ll_all); TextView tv_name = (TextView) holder.getView(R.id.tv_name); TextView tv_age = (TextView) holder.getView(R.id.tv_age); tv_age.setText(data.getAge()); tv_name.setText(data.getName()); ll_all.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if (onItemClickListner != null ) { onItemClickListner.onItemClickListner(holder.getRootView(), position); } } }); } } |
就问一句爽不爽 ,只需要写一个方法了,还有谁!
再把完整的代码贴出来一下
UserBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.qianmo.myview2.bean; /** * Created by Administrator on 2016/11/7 0007. */ public class UserBean { public UserBean(String name, String age) { this .name = name; this .age = age; } private String name; private String age; public String getName() { return name; } public void setName(String name) { this .name = name; } public String getAge() { return age; } public void setAge(String age) { this .age = age; } } |
item_user.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:background= "#ffffff" android:orientation= "vertical" > <LinearLayout android:id= "@+id/ll_all" android:layout_width= "match_parent" android:layout_height= "80dp" android:background= "#ffffff" android:gravity= "center_vertical" android:orientation= "vertical" android:paddingLeft= "10dp" android:paddingRight= "10dp" > <LinearLayout android:layout_width= "match_parent" android:layout_height= "wrap_content" android:background= "#ffffff" android:gravity= "center_vertical" android:orientation= "horizontal" > <TextView android:id= "@+id/tv_name" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "王继涛" android:textColor= "#000000" android:textSize= "16sp" /> <TextView android:id= "@+id/tv_age" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginLeft= "30dp" android:text= "18381339409" android:textColor= "#000000" android:textSize= "16sp" /> </LinearLayout> </LinearLayout> </LinearLayout> |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package com.qianmo.myview2; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Toast; import com.qianmo.myview2.base.BaseRecyclerViewAdapter; import com.qianmo.myview2.base.UserAdapter; import com.qianmo.myview2.base.UserSimpleRecycleAdapter; import com.qianmo.myview2.bean.UserBean; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements BaseRecyclerViewAdapter.OnItemClickListner { private RecyclerView recycleView; private Context mContext = MainActivity. this ; private UserAdapter mAdapter; private UserSimpleRecycleAdapter mUserSimpleRecycleAdapter; private List<UserBean> datas; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycleView = (RecyclerView) findViewById(R.id.recycleView); initView(); } private void initData() { datas = new ArrayList<>(); for ( int i = 0 ; i < 15 ; i++) { datas.add( new UserBean( "wangjtiao" , "" + i)); } } private void initView() { initData(); LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(mContext); mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recycleView.setLayoutManager(mLinearLayoutManager); mAdapter = new UserAdapter(mContext, datas, R.layout.item_user); mAdapter.setOnItemClickListner( this ); // mUserSimpleRecycleAdapter = new UserSimpleRecycleAdapter(mContext, datas); recycleView.setAdapter(mAdapter); } @Override public void onItemClickListner(View v, int position) { Toast.makeText(mContext, datas.get(position).getName() + ":" + datas.get(position).getAge() + ":" + position, Toast.LENGTH_SHORT).show(); } } |
ok,这样我们就封装完了·······