美文网首页
悬案解决: java.lang.IndexOutOfBounds

悬案解决: java.lang.IndexOutOfBounds

作者: 朱_c713 | 来源:发表于2020-05-08 17:07 被阅读0次

monkey经常会出现这个问题:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 6(offset:6).state:11 androidx.recyclerview.widget.RecyclerView错误
不幸的是新项目,手点,也能点出此问题

第一种:解决方案:包装LinearLayoutManager

public class RecyclerViewNoBugLinearLayoutManager extends LinearLayoutManager {
    public RecyclerViewNoBugLinearLayoutManager(Context context) {
        super( context );
    }

    public RecyclerViewNoBugLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super( context, orientation, reverseLayout );
    }

    public RecyclerViewNoBugLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super( context, attrs, defStyleAttr, defStyleRes );
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
            //try catch一下
            super.onLayoutChildren( recycler, state );
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        }

    }
}

问题存在。

相关链接:https://www.jianshu.com/p/7c675d5d2074

最终问题解决:

 private fun beginSearch() {
      mSearchResultListData.clear()
        val keyWords = etSearchTrim
        OkGoUtils.getRequest(
            ConstantUtils.getUrlConstant().video_searcher + "?keywords=" + keyWords + "&page=1",
            object : JsonCallBack<SeacherListBean>(SeacherListBean::class.java, this) {
                override fun onCacheSuccess(response: Response<SeacherListBean>?) {
                    //                super.onCacheSuccess(response);
                }

                override fun onSuccess(response: Response<SeacherListBean>) {
                    //获取搜索内容
              
                    val body = response.body()
                    et_seacher!!.setText(keyWords)
                    type = 0
                    mSearchResultListData.addAll(body.data)
                    if (mSearchResultListData.size > 0) {
                        mSearchResultAdapter!!.setNewData(mSearchResultListData)
                        refreshSearchResult(body.total)
                    } else {
                        showNoData()
                    }
                }
            })
    }
 private fun beginSearch() {

        val keyWords = etSearchTrim
        OkGoUtils.getRequest(
            ConstantUtils.getUrlConstant().video_searcher + "?keywords=" + keyWords + "&page=1",
            object : JsonCallBack<SeacherListBean>(SeacherListBean::class.java, this) {
                override fun onCacheSuccess(response: Response<SeacherListBean>?) {
                    //                super.onCacheSuccess(response);
                }

                override fun onSuccess(response: Response<SeacherListBean>) {
                    //获取搜索内容
                    mSearchResultListData.clear()
                    val body = response.body()
                    et_seacher!!.setText(keyWords)
                    type = 0
                    mSearchResultListData.addAll(body.data)
                    if (mSearchResultListData.size > 0) {
                        mSearchResultAdapter!!.setNewData(mSearchResultListData)
                        refreshSearchResult(body.total)
                    } else {
                        showNoData()
                    }
                }
            })
    }

移动了这一行的代码位置,相比大家也都清楚为甚么。原来的垃圾代码导致。

原来的下拉加载实在是不知所云:
期间还牵涉到两个方法:

  private fun refreshSearchResult(total: Int) {

        if (mSearchResultListData.size == 0) {
            mSearchResultAdapter!!.loadMoreEnd()
        }
        //如果总页数=1不用刷新
        if (total > 1) {
            mSearchResultAdapter!!.setOnLoadMoreListener {
                page++
                getLoadData()
            }
        } else {
            mSearchResultAdapter!!.loadMoreEnd(false)
        }


    }
   private fun getLoadData() {
        OkGoUtils.getRequest(
            ConstantUtils.getUrlConstant().video_searcher + "?keywords=" + etSearchTrim + "&page=" + page,
            object : JsonCallBack<SeacherListBean>(SeacherListBean::class.java, this) {

                override fun onStart(request: Request<SeacherListBean, out Request<*, *>>?) {
                    //                super.onStart(request);
                }

                override fun onCacheSuccess(response: Response<SeacherListBean>?) {
                    //                super.onCacheSuccess(response);
                }

                override fun onError(response: Response<SeacherListBean>) {
                    super.onError(response)
                    //触发搜索延迟
                    mSearchResultAdapter!!.loadMoreFail()
                }

                override fun onSuccess(response: Response<SeacherListBean>) {
                    if (response.body().data.size > 0) {
                        mSearchResultAdapter!!.addData(response.body().data)
                    }
                    //如果不够一页就显示更多布局
                    if (response.body().data.size < response.body().per_page) {
                        mSearchResultAdapter!!.loadMoreEnd(false)
                    } else {
                        mSearchResultAdapter!!.loadMoreComplete()
                    }

                }
            })
    }

可以看到他为了下载加载,写了三个方法,并且getLoadData和beginSearch,两个方法高度类似。只是传page的地方不一致。

解决方案:全部换成一个方法,beginSearch,将page变成活的参数,类似于getLoadData,调用轮子自带的下拉刷新api,重新写onSucess中方法。

    private fun beginSearch() {

        val keyWords = etSearchTrim
        OkGoUtils.getRequest(
            ConstantUtils.getUrlConstant().video_searcher + "?keywords=" + keyWords + "&page="+page,
            object : JsonCallBack<SeacherListBean>(SeacherListBean::class.java, this) {
                override fun onCacheSuccess(response: Response<SeacherListBean>?) {
                    //                super.onCacheSuccess(response);
                }

                override fun onSuccess(response: Response<SeacherListBean>) {

                    val body = response.body()
                    mSearchResultAdapter?.addData(body.data)
                    if (body.next_page_url==null) {
                        mSearchResultAdapter?.loadMoreEnd(false)
                    } else {
                        page++
                        mSearchResultAdapter?.loadMoreComplete()
                    }
                }

                override fun onError(response: Response<SeacherListBean>?) {
                    super.onError(response)
                    mSearchResultAdapter?.loadMoreFail()
                }
            })
    }

相关文章

  • 悬案解决: java.lang.IndexOutOfBounds

    monkey经常会出现这个问题:java.lang.IndexOutOfBoundsException: Inco...

  • 2017/3/16 周四

    GET MagicBook悬案得以解决:识别图片改成倾斜的书本图片。效果完美。

  • 悬案

    万万没想到,再次敲起键盘,是在她丢了以后。本来想给她写个连载,没想到现在就得给她写全剧终... 枫糖,是我和猫小姐...

  • 悬案

    阴森的巷道里 杀手的眼神中无限冷静 艺术家的沉重 血液中的罪恶 无辜的死亡 得不到的原谅不如去死 诗中没有同情 妄...

  • 悬案

    月影下,一个人立在路中央,鹰一般的眼睛看着远方的一举一动。突然,他趴了下来,耳朵紧紧贴着地面,似乎听见了什么。果然...

  • 悬案

  • 悬案

    警察:你最后一次见到B是在什么时候? A:前天晚上,我们约好昨天上午一起去打球。可是昨天他一直没有出现,到现在我还...

  • 悬案

    悬案 焦小桥 悠悠大学毕业后回到家乡,她挂念与她相依为命的奶奶,奶奶把她抚养大,供她读书,奶奶快到九十岁了,她想陪...

  • 悬案

    不知不觉中,《食罪者》系列的图书,我已经看到第六部了,但是无一例外,我还是没能猜出来第六部的杀人凶手到底是谁,作者...

  • “悬案”

    中午,还是娘俩吃饭。 熬个玉米面粥。 开锅了,开着盖,调小火力,慢慢搅。玉米面粥,小火,多熬一会儿,越熬越香。 搅...

网友评论

      本文标题:悬案解决: java.lang.IndexOutOfBounds

      本文链接:https://www.haomeiwen.com/subject/pidfnhtx.html