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

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

2,我们来简单的写一写吧,首先我们按照以前的方式写的话,看看有哪些代码,我们先来发出来看看

UserSimpleRecyclerAdapter.java

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

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

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,看一下代码:

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

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

<?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

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

 

Android--RecyclerView的封装使用的更多相关文章

  1. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

  2. Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector

     Android RecyclerView单击.长按事件:基于OnItemTouchListener + GestureDetector标准实现 Android RecyclerView虽然拥有L ...

  3. 极简的Android RecyclerView Adapter(使用DataBinding)

    阅读本篇文章需要读者对Android Databinding和RecyclerView有一定的了解. 简介 我们知道,DataBinding的核心理念是数据驱动.数据驱动驱动的目标就是View,使用D ...

  4. (转载)Android支付宝支付封装代码

    Android支付宝支付封装代码 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-12-22我要评论 这篇文章主要介绍了Android支付宝支付封装代码,Android支付的时候 ...

  5. Android RecyclerView 实现支付宝首页效果

    Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...

  6. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

  7. Android RecyclerView的基本使用

    Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewG ...

  8. Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  9. Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  10. 浅谈Android RecyclerView

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

随机推荐

  1. curl 小结

    cURL可以使用URL的语法模拟浏览器来传输数据, 因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以 ...

  2. debian 安装svn apache 小记. AuthzSVNAccessFile 不生效问题.

    docker 使用docker镜像搭建svn+Apache环境 https://my.oschina.net/u/2006667/blog/637882 1,安装 apache ,svnapt-get ...

  3. http状态码详解

    1 网址协议不支持的协议. 2 检测器内部错误. 3 网址格式不正确. 5 无法连接到代理服务器. 6 无法连接到服务器或找不到域名. 7 连接服务器失败. 28 操作超时.可能原因:页面执行时间过长 ...

  4. HTML当中特殊字符的表示

    (回车换行) <br> (空格符)   &(AND符号) & <(左尖括号.小于号) < >(右尖括号.大于号) > °(度) ° •(间隔符) • ...

  5. 【luogu】 P1433 吃奶酪

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. ...

  6. centos建立回收站

    linux下的回收站在每一个当前用户目录./local/share/Trash中. 也可以给linux添加一个回收站. mkdir /tmp/trash_tmp 建立一个回收站目录 vi /bin/t ...

  7. HTML基础篇之列表相关标签和特殊字符实体

    HTML字符实体 常用的字符实体: 实体字符 字符实体 大于号 (>) > 小于号 (<) < 引号 (") " 注册商标(®) ® 版权(© ) © &a ...

  8. Unity学习疑问记录之触屏

    当将Unity游戏运行到ios或android设备上时,桌面系统中的鼠标左键操作可以自动变为手机屏幕上的触屏操作,但鼠标操作无法实现一些特有的触屏操作,比如多点触屏. 触控对于Android移动设备来 ...

  9. Visual Studio 2010编译时总是提示"调用目标发生了异常"的解决

    现象: 无论建立的是Win32 Console的解决方案,还是MFC的解决方案,重新打开Visual Studio 2010之后,编译时总是提示“调用的目标发生了异常” 解决: 1. 关闭Visual ...

  10. hive 使用where条件报错 java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode

    hadoop 版本 2.6.0 hive版本 1.1.1 错误: java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalk ...