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相关推荐

  1. Android RecyclerView(和SnapHelper) 实现类似ViewPager的效果

    实现的效果图如下 2 行代码就实现了,其余的都是recyclerview 的代码 如果不显示一次可以滑动多个的话可以使用LinearSnapHelper 具体代码如下(实际就2行代码呢) recycl ...

  2. android RecyclerView 添加可拖动的滚动条

    实现的效果图如下,为了效果这里我设置的宽了一些,实际根据需求修改即可 先说几个属性: android:scrollbars" 一般都是垂直的滚动条设置vertical android:scr ...

  3. RecyclerView 判断滑动到顶部和底部

    可以使用系统提供的 canScrollVertically 方法来判断 具体如下 recycler_view.addOnScrollListener(new RecyclerView.OnScroll ...

  4. RecyclerView 刷新的时候出现阴影的处理方法

    这个阴影是RecyclerView 的问题引起的 处理方法如下 recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); 这样阴影就消失了.

  5. RecyclerView 删除Item 以及删除整个RecyclerView

    学而时习之,温故而知新. 今天用到了,居然忘记了,好尴尬,这里深夜了也在记录下, 1 删除整个RecyclerView hisList.clear();hisAdapter.notifyDataSet ...

  6. 2个RecyclerView 联动

    看下效果图, 底部在给出demo地址 如果想实现类似拼多多的商品联动也是可以的,修改方法即可 下面看下实现方法 几个参数需要知道 findFirstVisibleItemPosition 显示界面第一 ...

  7. RecyclerView 滑动显示返回按钮,点击返回到顶部

    底部有demo 地址*************************** 需要提前知道一些只是 RecyclerView.SCROLL_STATE_IDLE 是RecyclerView 滑动停止状态 ...

  8. RecyclerView smoothScrollToPosition 和 scrollToPosition 的区别

    smoothScrollToPosition  是平衡的滑动 , 假如现在返回首页 recyclerView.smoothScrollToPosition(0); 看下效果图 scrollToPosi ...

  9. RecyclerView 的findFirstVisibleItemPosition()与findLastVisibleItemPosition()

    findFirstVisibleItemPosition 显示界面的第一个位置 findLastVisibleItemPosition 显示界面最后一个位置 画一个图来说下把 一个横向的Recycle ...

  10. Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView

    今天创建了一个 demo ,然后就是复制RecyclerView 过去, 到最后完成运行的时候发现 系统奔溃了, 然后 提示 Binary XML file line #8: Error inflat ...

最新文章

  1. Linux网络编程--TCP中的三次握手和四次挥手
  2. 局域网共享的解决方法
  3. Docker Compose——搭建Redis集群
  4. spring boot基础教程:入门程序Hello World的编写
  5. 企业 MySQL 优化实施方案
  6. [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
  7. android单独刷入镜像
  8. 八种排序整理(六)----堆排序
  9. 荔枝服务器维护,手把手为你讲解win10系统自动维护功能管理的问题.
  10. 计算机考试总时长,计算机等级考试时间|2013年计算机等级考试时长
  11. Spring框架之控制反转和依赖注入
  12. 32位微型计算机原理接口,32位微机原理及接口技术
  13. [python]《天龙八部》文本处理
  14. Google OpenThread 技术研讨会
  15. SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
  16. ai怎么调界面大小_Adobe Illustrator(Ai)怎么改变页面大小,快捷键是什么?
  17. PoetryGenerator的参数
  18. 调用图形验证码接口时,为什么要在接口后方添加随机数
  19. 比较好做的计算机毕设,大学几年快结束了,计算机毕设到底该怎么做?
  20. 基于帧间频域分析的视频篡改检测

热门文章

  1. Windows Azure Storage – 4万亿对象和计数
  2. 茫茫IT,我们努力,在努力。
  3. IDEA 引入传统 j2ee spring mvc
  4. 使用DbVisualizer连接和管理金仓数据库
  5. winform 打包
  6. 1134. Vertex Cover (25)
  7. Knockout js 绑定 radio 时,当绑定整形的时候,绑定不生效
  8. (转)SQL操作全集
  9. MySQL MySQL为什么有时候会选错索引?
  10. 挖掘机实现“无人驾驶”!协作机器人“魔法之手”取代人工操作