自从v7包中的recyclerview出来以后很多之前要用listview实现的效果用recyclerview很简单就实现了,而且性能上也会有所提升,但是RecyclerView也有相比ListView不太方便的地方,比如ListView作为AdapterView的子类,有setEmptyView方法来设置列表为空时显示的view,这个功能一般都会用到,但是官方的RecyclerView并没有提供这个方法,另一方面,之前我们在涉及到数据库列表展示的时候会经常使用CursorAdapter,因为它能够在cursor数据变化时自动更新数据并刷新界面,不用我们手动再去调用,setAdapter之后什么都不用管了,而和RecyclerView配套的RecyclerView.Adapter并没有相关的子类提供类似的功能,那么本文就是要提供一种思路来实现扩展RecyclerView支持setEmptyView(View)和RecyclerView.Adapter支持cursor自动管理数据。
项目地址:https://github.com/mingyangShang/SupportRecyclerDemo
主要扩展功能:
- SupportRecyclerView#setEmptyView支持设置数据源为空时的view
- SupportRecyclerView.SupportAdapter#setOnItemClickListener:设置每个item的点击事件
- SupportRecyclerView.SupportAdapter#setOnItemLongClickListener:设置每个item的长按事件
- AbstractRecycleCursorAdapter:支持Cursor监听数据实时更新列表
- RecyclerCursorAdapter
首先看下CursorAdapter是如何实现自动更新cursor数据的,代码不长,而且其中有很多注释,其实关键的地方也就那么几个。
- 观察者模式监听Cursor的变化(init函数):
if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) {
mChangeObserver = new ChangeObserver();
mDataSetObserver = new MyDataSetObserver();
} else {
mChangeObserver = null;
mDataSetObserver = null;
}
if (cursorPresent) {
if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
if (mDataSetObserver != <