为什么我在我的RecyclerView上得到c 返回空引用用

ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方
<span type="1" blog_id="2066688" userid='
分享到朋友圈
好的文章,和好友一起分享我在为RecyclerView添加Header时遇到的困难 - 简书
我在为RecyclerView添加Header时遇到的困难
RecyclerView是Google推出的一款用来显示大量数据的android控件, 是ListView,GridView等控件的优化版。它的使用非常灵活,高度的解耦,强制使用ViewHolder,性能更优。
它取消了ListView的addHeaderView方法,所以不能像ListView那样方便的添加头部样式。
先上图说说我想实现的效果
为RecyclerView添加header
其实就是在聊天的界面上方加入一个头部布局。头部布局里会显示聊天对象的信息。
我一开始的时候用的是这个github上的开源插件。 但是用在我的项目中有一个致命的问题 - 用户进入聊天的时候会先显示最新消息,这个时候是不需要加入头部样式的,而只用在用户手动上滑到最早信息的时候显示。但是,这个插件总是会在用户进入的时候显示头部样式,并且遮盖一部分的历史信息。
后来只能老老实实的巧用RecyclerView的Adapter,先判断是不是已经获取到了最早的信息,如果是的话,在position为0的时候,返回头部布局的view并添加头部数据。参考了完成。
这个文章对RecyclerView如何加Header讲的很细致全面,不过它并没有动态添加数据到头部文件里,而我的聊天界面的头部布局需要动态添加聊天对象信息。于是我对作者的方法进行了一些修改。
作者的ListHolder
如果是头部布局的话,作者的ListHolder直接返回空,因为他不需要为头部布局绑定任何数据,我会在ListHolder中获取头部布局中需要绑数据的控件,并重新onBind()方法,判断如果view是头部文件并且position为0的话,就动态添加数据。我的数据是通过重写Adapter的构造方法传过去的。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新ViewPager图表(Chart)菜单(Menu)浮动菜单对话框空白页滑动删除手势操作RecyclerViewCardColorDrawableSpinner...
原文链接:https://github.com/opendigg/awesome-github-android-ui 在 Github 上做了一个很新的 Android 开发相关开源项目汇总,涉及到 Android 开发的方方面面,基本很全了。对 Android 开发感兴趣...
抽屉菜单 MaterialDrawer ★7337 - 安卓抽屉效果实现方案 Side-Menu.Android ★3865 - 创意边侧菜单 FlowingDrawer ★1744 - 向右滑动流动抽屉效果 SlidingRootNav ★1338 - 仿DrawerLa...
项目 style-trandfer deep traffic Flappy Bird activate flappybird anaconda基本用法 conda install numpy scipy pandas conda install numpy=1.10 con...
万维钢的《精英日课》里有个章节聊到了进化理论,他举了一个非常简单的例子:你的家族在100年前过得非常艰难,历经了磨难,但是经过几代人的努力,现在发达了,家里家大业大,生意做的很红火,而且人才辈出,过上了富裕的生活。 从神学角度分析,人们会告诉你,一定是你的祖先积了很多善德,...
她始终对他抱有期望,恋恋不舍。甚至期待着他回来痛哭流涕地忏悔,然后,她就可以原谅他。她终于理解,为什么面对不忠男人的蹩脚谎言,女人们都可以相信。不是因为愚蠢,而是因为深爱和不舍。 “有时候,我会想,一个人消失了和死了,到底有什么区别?”伊雪落泪,悲伤卡在脖子里,连呼吸都痛。...
山河依旧好,人都憔悴了。 将军悲战地,瘦马卧空壕。 门面哀柳堤,城对夕阳道。 身死随百草,频频野火烧。 ----据元曲《哀江南》改编2737人阅读
android开发(20)
bug处理(1)
最近一直在忙别的项目,RecyclerView出来后,大致看了一下,并没有在实际项目中使用,今天有空写个小程序,正好用了下,遇到了如下的问题。
因为一直觉得RecyclerView用起来很简单,我就引入了包后,直接写了个控件:
&android.support.v7.widget.RecyclerView
android:id="@+id/mountain_list"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
然后,在activity中啥都没干,先编译一下吧。
结果编译通过,运行时遇到这个错误:
java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()’ on a null object reference
看一下字面意思:空指针,试图在一个空的对象引用上调用一个虚拟方法canScrollVertically()
回去看了一下文档,原来RecyclerView将 layout 抽象成了一个 LayoutManager,RecyclerView 不负责子 View 的布局,我们可以自定义 LayoutManager 来实现不同的布局效果,目前只提供了LinearLayoutManager。 LinearLayoutManager 可以指定方向,默认是垂直, 可以指定水平, 这样就轻松实现了水平的 ListView。
最后结论,我们需要自己定义一个LayoutManager:
rv = (RecyclerView)findViewById(R.id.rv)
LinearLayoutManager layoutManager = new LinearLayoutManager(context)
layoutManager.setOrientation(LinearLayoutManager.VERTICAL)
rv.setLayoutManager(layoutManager)RecyclerView.ViewHolder onCreateViewHolder一直被调用到为啥_百度知道
RecyclerView.ViewHolder onCreateViewHolder一直被调用到为啥
我有更好的答案
只不过这个Listener不是设置到RecyclerView上而是设置到Adapter.item_iv);tv = (TextView)rootView.findViewById(R,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter.onItemLongClick(arg0, getPosition());}return true,getPosition());}}/rootView.setOnClickListener(this);this.mListener = listener,这对习惯使用ListView的开发者们使用起来更得心应手。从ViewHolder的代码中可以看到,执行onClick方法时会调用getPosition()将当前Item的位置回调给listener。getPosition()是ViewHolder的内置方法,可直接使用。上面提到过,listener是设定到Adapter上的,所以Adapter就需要对外开放相关方法.onItemClick(v,OnLongClickListener{public ImageVrootView.setOnLongClickListener(this);
MyViewHolder vh = new MyViewHolder(itemView!= null){mLpublic TextVprivate MyItemClickListener mLprivate MyItemLongClickListener mLongClickListener,mItemClickListener,mItemLongClickListener);
/** * 设置Item点击监听 * @param listener */
public void setOnItemClickListener(MyItemClickListener listener){
this.mItemClickListener =
public void setOnItemLongClickListener(MyItemLongClickListener listener){
*** 点击监听*/@Overridepublic boolean onLongClick(View arg0) {if(mLongClickListener != null){mLongClickL@Overridepublic void onClick(View v) {if(mListener , int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout,所以我们只需要拿到rootView并给其绑定点击监听事件即可。下面要考虑的就是怎样把listener传递进来。Demo中设定了监听点击事件的I*** 长按监听*/public MyViewHolder(View rootView:MyItemClickL/span&因为在构造ViewHolder时,MyItemClickListener listener,MyItemLongClickListener longClickListener) {super(rootView);iv = (ImageView)rootView:123456789101112131415161718@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent.findViewById(R.
}MyItemClickListener模仿ListView的OnItemClickListener,开放了view和position两个参数.item, parent,false).id.item_tv);this.mLongClickListener = longClickListener,那不就可以在组装RecyclerView时就能够设置ItemClickListener,rootView将作为一个必传参数传递进来;}}&lt:123public interface MyItemClickListener {
public void onItemClick(View view,int postion)。我们首先看ViewHolder的代码:123456789101112131415161718192021222324252627282930313233343536373839public class MyViewHolder extends ViewHolder implements OnClickListener思路是:因为ViewHolder我们可以拿到每个Item的根布局;}&#47.mItemLongClickListener = listener
采纳率:97%
来自团队:
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 空指针引用 的文章

 

随机推荐