Android--RecyclerView的封装使用

转自:http://www.cnblogs.com/wjtaigwh/p/6039929.html

1,用了很长一段时间的RecyclerView,在项目中用的频率也越来越频繁(因为踩得坑也越来越多了),或过头来看,感觉一直在写RecyclerView.Adapter中的三个方法和一个内部类,感觉很浪费时间,那么今天我们来试着封装封装,来减少我们的使用

先看一下我们的实现效果:

《Android--RecyclerView的封装使用》

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,这样我们就封装完了·······

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/bsmmaoshenbo/article/details/68066460
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞