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. 工具类 util.Date 日期类

    /** * @description format the time * @author xf.radish * @param {String} format The format your want ...

  2. sql第二天

    --基本格式 select * from tblclass --对于列进行限制 --格式一:取指定列 select cid,cname from TblClass select cname from ...

  3. 解决Windows内存问题的两个小工具RamMap和VMMap(这个更牛更好)

    来源:http://www.cr173.com/html/13006_1.html .net程序内存监测分配工具(CLR Profiler for .NET Framework 4)官方安装版 类型: ...

  4. Saltstack 常用的模块及API

    Saltstack提供了非常丰富的功能模块,设计操作系统的基础功能,常用工具支持等, 官网模块介绍 http://docs.saltstack.com/ref/modules/all/index.ht ...

  5. TheFourthJavaText

    在Java语言中,在一个类的内部静态方法是无法直接访问该类的非静态成员的,这一点和C++一致.比如下面的代码: import javax.swing.JOptionPane; public class ...

  6. Linux下区分物理CPU、逻辑CPU和CPU核数

    ㈠ 概念           ① 物理CPU                             实际Server中插槽上的CPU个数              物理cpu数量,可以数不重复的 p ...

  7. Linux下Modules的概念及使用详解[转贴]

    一.什么是 modules? modules 的字面意思就是模块,在此指的是 kernel modules:简单来说,一个模块提供了一个功能,如 isofs.minix.nfs.lp 等等.传统来讲, ...

  8. Html批量读取json

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <sc ...

  9. 《JS权威指南学习总结--9.1 类和模板》

    内容要点: 一.JS类 在JS中,类的所有实例对象都从同一个原型对象上继承属性.因此,原型对象是类的核心.在例6.1 原型中定义了inherit()函数(通过原型继承创建一个新对象),这个函数返回一个 ...

  10. lorem ipsum text占位符

    Web开发者通常用lorem ipsum text来做占位符,占位符就是占着位置的一些文字,没有实际意义. 为什么叫lorem ipsum text呢? 是因为lorem ipsum是古罗马西塞罗谚语 ...