RecyclerView
RecyclerView优秀文集
RecyclerView.ViewHolder
RecyclerView.Adapter
LayoutManager
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
DefaultItemAnimator
ItemTouchHelper
SnapHelper
RecyclerView.RecycledViewPool
CursorAdapter
hold a CursorAdapter member in my recyclerView.Adapter implementation. Then passing all the handling of creating the new view & binding it to the cursor adapter
public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder> {// Because RecyclerView.Adapter in its current form doesn't natively // support cursors, we wrap a CursorAdapter that will do all the job// for us.CursorAdapter mCursorAdapter;Context mContext;public MyRecyclerAdapter(Context context, Cursor c) {mContext = context;mCursorAdapter = new CursorAdapter(mContext, c, 0) {@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {// Inflate the view here}@Overridepublic void bindView(View view, Context context, Cursor cursor) {// Binding operations}};}public static class ViewHolder extends RecyclerView.ViewHolder {View v1;public ViewHolder(View itemView) {super(itemView);v1 = itemView.findViewById(R.id.v1);}}@Overridepublic int getItemCount() {return mCursorAdapter.getCount();}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {// Passing the binding operation to cursor loadermCursorAdapter.getCursor().moveToPosition(position); //EDITED: added this line as suggested in the comments below, thanks :)mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor());}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// Passing the inflater job to the cursor-adapterView v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent);return new ViewHolder(v);}
}
SimpleCursorAdapter参数之谜
简书作者:zzh0838,原文链接:http://www.jianshu.com/p/daadc9d2bf1a
Question
SimpleCursorAdapter的构造函数是
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags);
最后一个参数可选的值有:
- FLAG_AUTO_REQUERY (这个值在Api 11 以后(包含)被弃用了,不用管)
- FLAG_REGISTER_CONTENT_OBSERVER
- 0
那到底应该选哪一个呢(虽然只是二选一)?没错,我懵逼了。这个时候,当然是google来帮忙,stackOverFlow搜一搜,but,but,but,搜到的内容都很简略,没人告诉我,我在写SimpleCursorAdapter的时候应该传哪一个参数。
Answer
自己看源码喽,先看看继承继承关系吧(来至官方文档):
java.lang.Object↳ android.widget.BaseAdapter↳ android.widget.CursorAdapter↳ android.widget.ResourceCursorAdapter↳ android.widget.SimpleCursorAdapter
好吧,先看看SimpleCursorAdapter的默认构造函数吧
public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from,int[] to, int flags) {super(context, layout, c, flags);mTo = to;mOriginalFrom = from;findColumns(c, from);}
可以看到flags传到了父类ResourceCursorAdapter的构造函数。那我们去看看吧。
public ResourceCursorAdapter(Context context, int layout, Cursor c, int flags) {super(context, c, flags);mLayout = mDropDownLayout = layout;mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);mDropDownInflater = mInflater;}
flags又传到父类CursorAdapter了,再去看看:
public CursorAdapter(Context context, Cursor c, int flags){init(context, c, flags);
}
调用了init:
void init(Context context, Cursor c, int flags) {if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {flags |= FLAG_REGISTER_CONTENT_OBSERVER;mAutoRequery = true;} else {mAutoRequery = false;}boolean cursorPresent = c != null;mCursor = c;mDataValid = cursorPresent;mContext = context;mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1;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 != null) c.registerDataSetObserver(mDataSetObserver);}}
函数有点长,假设我们的flags设置成了 0,不会有什么操作,假设我们的flags设置成了FLAG_REGISTER_CONTENT_OBSERVER, 那么接下来会构造两个Observer:
mChangeObserver = new ChangeObserver();
mDataSetObserver = new MyDataSetObserver();
并且在cursor不为null的时候将这两个Observer注册给cusor。
if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver);
那么问题来了,什么时候这两个Observer才会被触发呢?看看Cursor文档吧,文档了这么说的。
当调用方法requery()时,会触发ContentObserver。
当调用方法requery(), deactivate(), or close()时,DataSetObserver会被触发。
然后继续看文档,requery(), deactivate()都被弃用了。调用close后,cursor就没了(Closes the Cursor, releasing all of its resources and making it completely invalid.)。我尼玛,我尼玛,我尼玛,我心里一万只草泥马在奔腾,都不用看两个Observer定义的操作了。传这个参数压根就没什么鸟用。lz彻底懵逼了。
好了,现在可以下结论了:flag永远传0就可以了
RecyclerView相关推荐
- Android RecyclerView(和SnapHelper) 实现类似ViewPager的效果
实现的效果图如下 2 行代码就实现了,其余的都是recyclerview 的代码 如果不显示一次可以滑动多个的话可以使用LinearSnapHelper 具体代码如下(实际就2行代码呢) recycl ...
- android RecyclerView 添加可拖动的滚动条
实现的效果图如下,为了效果这里我设置的宽了一些,实际根据需求修改即可 先说几个属性: android:scrollbars" 一般都是垂直的滚动条设置vertical android:scr ...
- RecyclerView 判断滑动到顶部和底部
可以使用系统提供的 canScrollVertically 方法来判断 具体如下 recycler_view.addOnScrollListener(new RecyclerView.OnScroll ...
- RecyclerView 刷新的时候出现阴影的处理方法
这个阴影是RecyclerView 的问题引起的 处理方法如下 recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); 这样阴影就消失了.
- RecyclerView 删除Item 以及删除整个RecyclerView
学而时习之,温故而知新. 今天用到了,居然忘记了,好尴尬,这里深夜了也在记录下, 1 删除整个RecyclerView hisList.clear();hisAdapter.notifyDataSet ...
- 2个RecyclerView 联动
看下效果图, 底部在给出demo地址 如果想实现类似拼多多的商品联动也是可以的,修改方法即可 下面看下实现方法 几个参数需要知道 findFirstVisibleItemPosition 显示界面第一 ...
- RecyclerView 滑动显示返回按钮,点击返回到顶部
底部有demo 地址*************************** 需要提前知道一些只是 RecyclerView.SCROLL_STATE_IDLE 是RecyclerView 滑动停止状态 ...
- RecyclerView smoothScrollToPosition 和 scrollToPosition 的区别
smoothScrollToPosition 是平衡的滑动 , 假如现在返回首页 recyclerView.smoothScrollToPosition(0); 看下效果图 scrollToPosi ...
- RecyclerView 的findFirstVisibleItemPosition()与findLastVisibleItemPosition()
findFirstVisibleItemPosition 显示界面的第一个位置 findLastVisibleItemPosition 显示界面最后一个位置 画一个图来说下把 一个横向的Recycle ...
- Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView
今天创建了一个 demo ,然后就是复制RecyclerView 过去, 到最后完成运行的时候发现 系统奔溃了, 然后 提示 Binary XML file line #8: Error inflat ...
最新文章
- Linux网络编程--TCP中的三次握手和四次挥手
- 局域网共享的解决方法
- Docker Compose——搭建Redis集群
- spring boot基础教程:入门程序Hello World的编写
- 企业 MySQL 优化实施方案
- [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
- android单独刷入镜像
- 八种排序整理(六)----堆排序
- 荔枝服务器维护,手把手为你讲解win10系统自动维护功能管理的问题.
- 计算机考试总时长,计算机等级考试时间|2013年计算机等级考试时长
- Spring框架之控制反转和依赖注入
- 32位微型计算机原理接口,32位微机原理及接口技术
- [python]《天龙八部》文本处理
- Google OpenThread 技术研讨会
- SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
- ai怎么调界面大小_Adobe Illustrator(Ai)怎么改变页面大小,快捷键是什么?
- PoetryGenerator的参数
- 调用图形验证码接口时,为什么要在接口后方添加随机数
- 比较好做的计算机毕设,大学几年快结束了,计算机毕设到底该怎么做?
- 基于帧间频域分析的视频篡改检测
热门文章
- Windows Azure Storage – 4万亿对象和计数
- 茫茫IT,我们努力,在努力。
- IDEA 引入传统 j2ee spring mvc
- 使用DbVisualizer连接和管理金仓数据库
- winform 打包
- 1134. Vertex Cover (25)
- Knockout js 绑定 radio 时,当绑定整形的时候,绑定不生效
- (转)SQL操作全集
- MySQL MySQL为什么有时候会选错索引?
- 挖掘机实现“无人驾驶”!协作机器人“魔法之手”取代人工操作