RecyclerView无需多说,是用于替代ListView的新控件。它的适配器在于灵活。

现在有一个需求:需要RecyclerView的item支持点击事件,并且下拉到最后时,显示ProgressBar表明正在加载,并加载更多数据。

1.点击事件的实现

先定义一个接口

public interface RecyclerViewClickListener {
void onItemClick(View view,int position);
}

适配器构造函数,增加Click对象的传递

  private RecyclerViewClickListener mClickListener;

 public PostListAdapter(RequestQueue rQueue, RecyclerViewClickListener clickListener) {

         this.mClickListener = clickListener;
}

创建Item的Holder对象时,传递Click对象到Holder的构造函数中(以下仅保留关键代码)

 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
NormalAnswerHolder holder = new NormalAnswerHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home, parent, false), mClickListener);
return holder; }
}

Holder类中处理Click事件

     class NormalAnswerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private RecyclerViewClickListener mClickListener;
private TextView textViewName;
private TextView textViewCount;
private TextView textViewExcerpt; public NormalAnswerHolder(View view, RecyclerViewClickListener clickListener) {
super(view);
this.mClickListener = clickListener;
textViewName = (TextView) view.findViewById(R.id.tv_name);
textViewCount = (TextView) view.findViewById(R.id.tv_count);
textViewExcerpt = (TextView)view.findViewById(R.id.tv_excerpt); itemView.setOnClickListener(this);
} /**
* Click event.
*
* @param v
*/
@Override
public void onClick(View v) {
if (mClickListener != null) {
mClickListener.onItemClick(v, getPosition());
}
}
}

注意:Holder类的构造函数中获得Click对象后,最基本的需要对itemView设置点击事件。如果需要对item中的subview设置单独的点击事件,就对相应的view设置点击事件即可。

Click事件的调用:

 mAdapter = new PostListAdapter(mQueue, new RecyclerViewClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(getActivity(), ArticleDetailActivity.class);
Post post = mAdapter.getPost(position);
if (post == null) return;
intent.putExtra(Define.KEY_DATE, post.getDate());
intent.putExtra(Define.KEY_NAME, post.getName());
startActivity(intent);
}
});

注意:如果需要针对不同subview的点击事件处理,在onItemClick中就需要自行依据view类型或者其他tag类标识进行区别自行处理。

2.底部Progressbar加载显示。类似于ListView的适配器,普通情况显示正常item,判断加载的item是否为当前最后一个,如果是当前最后一个,就显示为自定义的Footview,并通知进行数据加载,数据加载完成后刷新。

首先需要定义两种item的Holder,正常的和底部的,然后在适配器中进行判断。

    private final int TYPE_ITEM = 0;
private final int TYPE_FOOTER = 1;

定义两个值用于区别不同的holder。

 @Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else { return TYPE_ITEM;
}
}

重载getItemViewType,通过当前位置判断是否要加载FootView。

 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
FooterViewHolder holder = new FooterViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.footerview, parent, false));
return holder;
}else{
NormalAnswerWithDateHolder holder = new NormalAnswerWithDateHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_homewithdate, parent, false), mClickListener);
return holder;
}
}

依据当前不同的类型,加载不同的ViewHolder

触发加载更多,目前只想到利用RecyclerView的setOnScrollListener事件来判断当前滚动的item位置。

 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& mLinearLayoutManager.findLastVisibleItemPosition() + 1
== mAdapter.getItemCount()) {
requestOldData();
}
}
});

完。

RecyclerView.Adapter的更多相关文章

  1. Android 利用RecyclerView.Adapter刷新列表中的单个view问题

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  2. Android RecyclerView.Adapter notifyDataSetChanged 不起作用

    我在自己动手写RecyclerView的上拉加载更多,最后就差一步,这个时候数据已经加载完了,UI上面没有显示,我而且也调用了notifyDataSetChanged刷新item的数据,但是一直没效果 ...

  3. Android RecyclerView Adapter 新式用法之SortedListAdapterCallback

    引言 前几天在同事的提醒下发现V7中有了一个新的工具类SortedListAdapterCallback,配合RecyclerView Adapter和SortedList一起使用更加方便的管理我们在 ...

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

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

  5. RecyclerView.Adapter优化了吗?

    昨天写了一篇「还在用ListView?」讲的内容是RecyclerView的使用技巧以及一些经常使用的开源库.有朋友反馈"我已经在用recyclerview了",那么怎样让它更好用 ...

  6. RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;

    之前对ListView的BaseAdapter进行过封装,只需重写一个getView方法: 现在慢慢的RecyclerView成为主流,下面是RecyclerView.Adapter的封装: Base ...

  7. Android开发教程 - 使用Data Binding(六)RecyclerView Adapter中的使用

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  8. RecyclerView高速通用适配Adapter

    RecyclerView Adapter 为RecyclerView提供更简单的适配器实现方式,不断更新完好中. Demo视频演示 GitHub地址 博客 使用 BaseViewHolder 的使用 ...

  9. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

随机推荐

  1. 干货篇:揭开CSS盒模型神秘的面纱

    写博客可以对学习内容进行总结.分享和交流(面对面的技术分享会也不错)... 如果是单纯的记录,印象笔记完全够了. 步入正题,盒模型是web布局核心,掌握基础知识,以后实战中会如鱼得水~ 概念与历史 C ...

  2. C++设计模式-singleton单例模式_new

      class nocopyable { protected: nocopyable(){}; virtual ~nocopyable(){}; nocopyable(const nocopyable ...

  3. 安装TensorFlow的步骤

    安装步骤: 1.安装虚拟机: 2.安装liunx系统: 3.安装TensorFlow. 1.安装虚拟机:虚拟机的版本是不能太低的.我使用的是:VMware-workstation-full-12.0. ...

  4. php根据IP获取经纬度信息--百度地图篇

    一.前言 之前一篇写过 php根据IP获取IP所在城市  ,但是还想再精确一点,获取这个IP所在的经纬度信息,该怎么办呢? 百度地图为我提供了一种解决方案(当然还有其他的解决方案). 先总的来数一下, ...

  5. js构造函数的完美继承(欢迎吐槽)

    function Animal(){ //定义父类 this.leibie="动物"; } Animal.prototype.test1=[1,2]; function Cat(n ...

  6. Nis+Nfs+Autofs

    Nis: NIS服务的应用结构中分为NIS服务器和NIS客户机两种角色 NIS服务器集中维护用户的帐号信息(数据库)供NIS客户机进行查询 用户登录任何一台NIS客户机都会从NIS服务器进行登录认证, ...

  7. 关于python的元类

    当你创建一个类时: class Foo(Bar): pass Python做了如下的操作: Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__ ...

  8. 使用hexo搭建github博客

    Win7系统已经安装了node.js和npm npm install -g hexo-cli 全局安装hexo客户端 hexo init blog 在喜欢的位置初始化blog目录 cd blog np ...

  9. bootstrip 折叠菜单

    body { font-family: "宋体"; font-size: 12px } .menu { height: 30px; background: #e6e6e6; mar ...

  10. Jmeter 多台机器产生负载

    使用多台机器产生负载的操作步骤如下: (1)在所有期望运行jmeter作为 负载生成器的机器上安装jmeter, 并确定其中一台机器作为 controller ,其他的的机器作为agent .然后运行 ...