前言
项目中viewpager中的fragment中使用了RecyclerView显示当前发布的商品和结束发布的商品
现象
上午测试的时候出现了一个很奇怪的错误,viewpager总共有两页,从第一页移动到第二页的时候,没有反应。从第二页往回滑动的时候,总是程序直接奔溃。错误打印如下:
java.lang.NullPointerException at android.support.v7.widget.RecyclerView.onInterceptTouchEvent
ps:在调试这个的过程中,发现后台使用desc字段表示描述(使用注解 @column,加上@Lob也是不行),从java实体类使用hibernate自动生成更新数据库表时无法创建该表。又是查注解,又是改变字段长度。反反复复得折腾了一遍都不行,后来其删除就可以创建表了,猜想可能是字段名的原因。
以前在项目中也遇到过数据库使用了一个struts的保留字,struts封装参数成对象的时候一直出错。后来才知道这是保留字
解决
网上大概意思是说没有设置布局。但是我是的确添加了是在notifyDataSetChange之前设置了布局,但是就是报错。
其实是在goodses.size()==0的情况下没有设置布局。但是不知道为什么就潜意识的觉得这种情况不需要设置布局,只有在adapter更新的时候才需要。
btProgressDialog.dismiss();
if (msg.isSuccess() && goodses.size() == ) {
Toast.makeText(mContext, "您还没有发布过商品,去发布商品吧", Toast.LENGTH_LONG).show();
} else if((msg.isSuccess() && goodses.size() > )) {
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mAdapter.notifyDataSetChanged(goodses);
}else {
Toast.makeText(mContext, msg.getMsg(), Toast.LENGTH_LONG).show();
}
其实细细思索,真是无稽之谈。于是在所有的if情况都set布局,ok不管怎么滑都没事。再一想,在onPostExecute中显示一定需要执行一次设置布局,那么肯定是我理解错了,在onPre 设置布局或者更甚在显示RecyclerView之后就应该设置布局。在fragment中的initView中直接给RecyclerView设置布局。运行,怎么滑动都是ok。
private void initView() {
rv_current_publish.setLayoutManager(new LinearLayoutManager(getActivity()));
new MyPublishAsyncTask(getActivity(),goodses,rv_current_publish,isQueryCurrentPublish).execute();
}
血泪教训啊:一定要记得为RecyclerView添加布局
总结
在解决这个的过程中发现了一个新的问题
断点调试从2直接跳到 最后一句 return e.getMsg();而且这一句
Msg.generateSuccMsg();详细代码
public static Msg generateSuccMsg(){
return new Msg(true,"ok");
}
图中2箭头的语句绝对不会产生异常,但是现实就是从2断点往下执行时直接跳到左边转弯箭头指向位置。不仅跳到catch中了,而且还跳过了一句,直接执行return e.getMsg()了。不知道是我的问题还是编辑器的原因。???