Android--RecyclerView的封装使用

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值