当前位置: 首页 > news >正文

重点建设政协网站镇江网站建设推广

重点建设政协网站,镇江网站建设推广,网站建设引擎,怎么申请域名 制作网站报错截图:场景介绍:在使用recycleView 自动递增数据,且自动滚动到最新行; 当数据达到273条 时出现ANR;项目中 全部的列表适配器使用的三方库:BaseRecyclerViewAdapterHelper (很早之前的项目&am…

报错截图:

场景介绍:在使用recycleView 自动递增数据,且自动滚动到最新行; 当数据达到273条 时出现ANR;

项目中 全部的列表适配器使用的三方库:BaseRecyclerViewAdapterHelper (很早之前的项目)

代码:

public class LogRecyclerViewAdapter extends BaseQuickAdapter<LogBean,BaseViewHolder> {public LogRecyclerViewAdapter(int layoutResId, @Nullable List<LogBean> data) {super(layoutResId, data);}// 避免布局错乱@Overridepublic int getItemViewType(int position) {Log.d(TAG, "getItemViewType1111: " +position);return position;}@Overrideprotected void convert(BaseViewHolder helper, LogBean item) {String title = item.getTitle();String msg = item.getMsg();helper.setText(R.id.log_title_txt,title);helper.setText(R.id.log_msg_txt,msg);// 设置异常字体颜色if(msg.contains("异常")||msg.contains("中断")||msg.contains("失败")){helper.setTextColor(R.id.log_title_txt,Color.parseColor("#FF2C00"));helper.setTextColor(R.id.log_msg_txt, Color.parseColor("#FF2C00"));}}
}

解决 :根据报错提示,百度后解决 需要注释掉重写的getItemViewType 函数,其实是一个三方库的bug;

可参考:https://blog.csdn.net/lovelixue/article/details/103641023

为知其所以然 ,继续跟踪代码;

进入适配器继承的父类:BaseQuickAdapter该类继承自RecyclerView.Adapter<K> , 找到重写的getItemViewType 函数,getItemViewType的返回值 当有其他布局(头部脚部或空布局)时候返回值各自的常量;项目只是单item 没有添加其他View 代码会走

return getDefItemViewType(adjPosition);

该方法会重新定义getItemViewType的值而该值是position变量;

  @Overridepublic int getItemViewType(int position) {if (getEmptyViewCount() == 1) {boolean header = mHeadAndEmptyEnable && getHeaderLayoutCount() != 0;switch (position) {case 0:if (header) {return HEADER_VIEW;} else {return EMPTY_VIEW;}case 1:if (header) {return EMPTY_VIEW;} else {return FOOTER_VIEW;}case 2:return FOOTER_VIEW;default:return EMPTY_VIEW;}}int numHeaders = getHeaderLayoutCount();if (position < numHeaders) {return HEADER_VIEW;} else {int adjPosition = position - numHeaders;int adapterCount = mData.size();if (adjPosition < adapterCount) {return getDefItemViewType(adjPosition);} else {adjPosition = adjPosition - adapterCount;int numFooters = getFooterLayoutCount();if (adjPosition < numFooters) {return FOOTER_VIEW;} else {return LOADING_VIEW;}}}}protected int getDefItemViewType(int position) {if (mMultiTypeDelegate != null) {return mMultiTypeDelegate.getDefItemViewType(mData, position);}return super.getItemViewType(position);}

回到:LogRecyclerViewAdapter 类中 ,业务代码在convert函数中实现 跟踪该函数,发现在BaseQuickAdapter中被onBindViewHolder调用,代码如下:它会获取holder的getItemViewType ,其值的已经分析过 取自position ,每次源数据新增一条position就会随之递增;其实报错的时候,还没有执行到该函数,我们需要查看recycleView的源码 执行该方法之前还执行了onCreateViewHolder 函数。

 @Overridepublic void onBindViewHolder(K holder, int position) {//Add up fetch logic, almost like load more, but simpler.autoUpFetch(position);//Do not move position, need to change before LoadMoreView bindingautoLoadMore(position);int viewType = holder.getItemViewType();switch (viewType) {case 0:convert(holder, getItem(position - getHeaderLayoutCount()));break;case LOADING_VIEW:mLoadMoreView.convert(holder);break;case HEADER_VIEW:break;case EMPTY_VIEW:break;case FOOTER_VIEW:break;default:convert(holder, getItem(position - getHeaderLayoutCount()));break;}}

@Overridepublic K onCreateViewHolder(ViewGroup parent, int viewType) {K baseViewHolder = null;this.mContext = parent.getContext();this.mLayoutInflater = LayoutInflater.from(mContext);switch (viewType) {case LOADING_VIEW:baseViewHolder = getLoadingView(parent);break;case HEADER_VIEW:baseViewHolder = createBaseViewHolder(mHeaderLayout);break;case EMPTY_VIEW:baseViewHolder = createBaseViewHolder(mEmptyLayout);break;case FOOTER_VIEW:baseViewHolder = createBaseViewHolder(mFooterLayout);break;default:baseViewHolder = onCreateDefViewHolder(parent, viewType);bindViewClickListener(baseViewHolder);}baseViewHolder.setAdapter(this);return baseViewHolder;}

重点看下,switch 方法 ,会逐条遍历viewType,我们分别看case 条件值 ,分别是

public static final int HEADER_VIEW = 0x00000111;

public static final int LOADING_VIEW = 0x00000222;

public static final int FOOTER_VIEW = 0x00000333;

public static final int EMPTY_VIEW = 0x00000555;

是十六进制的魔法数字 ,case ==0 正常调用 0x00000111 转换成十进制是273 ,所以 当position 的值273的 时候,会进入第二个条件执行createBaseViewHolder (mHeaderLayout)此时的参数是null,

该函数表示通过反射的方式获取viewhold

protected K createBaseViewHolder(View view) {Class temp = getClass();Class z = null;while (z == null && null != temp) {z = getInstancedGenericKClass(temp);temp = temp.getSuperclass();}K k;// 泛型擦除会导致z为nullif (z == null) {k = (K) new BaseViewHolder(view);} else {k = createGenericKInstance(z, view);}return k != null ? k : (K) new BaseViewHolder(view);}

进入BaseViewHolder 类中,该类继承自RecyclerView.ViewHolder,作用是封装了各种赋值函数,通过getView 获取到item的view 去赋值等。

 public ViewHolder(@NonNull View itemView) {if (itemView == null) {throw new IllegalArgumentException("itemView may not be null");}this.itemView = itemView;}

终于跟踪到报错的地方了。因为当初入参是null 因此条件判断进入itemView ==null ,就有了开始的IDE的输出报错;

完美的闭环

如有不完善的地方,譬如:recycleView源码部分,没有仔细说明,请多多担待;

抱拳;

http://www.yidumall.com/news/72578.html

相关文章:

  • wordpress文件存储在阿里云oss郑州seo网站关键词优化
  • 住房城市建设部门户网站seo优化是怎么回事呢
  • 新公司网站建设要求2024年最新时事新闻
  • 网站系统建设推广代理登录页面
  • 网站开发流程需要用到的语言合肥seo推广外包
  • 静态网站优化在线代理浏览网页
  • 动态网站如何做甘肃新站优化
  • 太原网站建设地图全网自媒体平台大全
  • 公司做网站文案怎么写竞价推广思路
  • 天安节能科技园公司做网站网店代运营一年的费用是多少
  • 网站模板设计师要求今日最新新闻
  • 洛阳高新区做网站公司怎么进入百度推广账户
  • 做淘宝客网站能有效果吗媒体营销
  • 做快消品的网站如何推广小程序
  • 乌海做网站站长工具日本
  • 网站需要做实名认证如何做wordpress免费建站
  • 自我介绍ppt模板免费杭州网站运营十年乐云seo
  • 邯山区住房和城乡建设局网站百度一下你就知道主页
  • ps网页设计步骤及方法绍兴seo排名
  • 有移动端网站 怎么做app福州短视频seo方法
  • 门头设计网站推荐整站seo技术
  • 微信开发社区平台seo网站优化课程
  • 东莞网站建设哪家专业武汉武汉最新
  • 家政网站模板下载谷歌官网登录入口
  • 宿迁市建设局网站怎么投诉宁德seo
  • 做网站月薪资多少模板建站平台
  • 毕业论文网站如何发布自己的广告
  • 全国通网站建设培训机构需要什么资质
  • 2017网站icp备案seo搜索引擎优化哪家好
  • 外汇做单记录做单专业网站有哪些深圳平台推广