如何滚动时改变RecyclerView内容 [英] How to change contents of RecyclerView while scrolling

查看:310
本文介绍了如何滚动时改变RecyclerView内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用 RecyclerView 要显示的项目名称。我行包含单个的TextView 。项目名称都存储在名单,其中,字符串> mItemList

要修改 RecyclerView 的内容,我替换字符串中的 mItemList 并调用 notifyDataSetChanged ()在 RecyclerViewAdapter

但是,如果我试图改变内容的 mItemList 而RecyclerView正在滚动,有时它给了我   java.lang.IndexOutOfBoundsException:不一致检测。无效的项目位置157(偏移:157).state:588

这会发生,如果 mItemList 的尺寸比以前少了。那么,什么是改变 RecyclerView 内容的正确方法是什么?这是 RecyclerView

中的错误

下面是异常的完整的堆栈跟踪:

  java.lang.IndexOutOfBoundsException:不一致检测。无效的项目位置157(偏移:157).state:588
        在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:330​​0)
        在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:3258)
        在android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:1803)
        在android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
        在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
        在android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)
        在android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)
        在android.support.v7.widget.RecyclerView $ ViewFlinger.run(RecyclerView.java:2715)
        在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:725)
        在android.view.Choreographer.doCallbacks(Choreographer.java:555)
        在android.view.Choreographer.doFrame(Choreographer.java:524)
        在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:711)
        在android.os.Handler.handleCallback(Handler.java:615)
        在android.os.Handler.dispatchMessage(Handler.java:92)
        在android.os.Looper.loop(Looper.java:137)
        在android.app.ActivityThread.main(ActivityThread.java:4921)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:511)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1027)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        在dalvik.system.NativeStart.main(本机方法)
 

适配器视图code:

 私有静态类FileListAdapter扩展RecyclerView.Adapter< FileHolder> {
    私人最终语境mContext;
    私人最终SparseBooleanArray mSelectedArray;
    私人最终名单,其中,字符串> mList;

    FileListAdapter(上下文的背景下,列表与LT;字符串>清单,SparseBooleanArray selectedArray){
        mList =清单;
        mContext =背景;
        mSelectedArray = selectedArray;
    }


    @覆盖
    公共FileHolder onCreateViewHolder(ViewGroup中的ViewGroup,int i)以{

        查看查看= LayoutInflater.from(viewGroup.getContext())。膨胀(
                R.layout.file_list_item,ViewGroup中,假);

        TextView的电视=(TextView中)查看
                .findViewById(R.id.file_name_text);
        字体的字体= Typeface.createFromAsset(viewGroup.getContext()。getAssets(),
                。viewGroup.getContext()的getString(R.string.roboto_regular));
        tv.setTypeface(字体);

        返回新FileHolder(视图,电视);
    }

    @覆盖
    公共无效onBindViewHolder(FileHolder fileHolder,最终int i)以{

        字符串名称= mList.get(我);

        如果选择//突出看法
        的setSelected(fileHolder.itemView,mSelectedArray.get(I));

        //设置文本
        fileHolder.mTextView.setText(名称);
    }

    @覆盖
    公众诠释getItemCount(){
        返回mList.size();
    }
}

私有静态类FileHolder扩展RecyclerView.ViewHolder {

    公众最后的TextView mTextView;

    公共FileHolder(查看ItemView控件,TextView的电视){
        超(ItemView控件);
        mTextView =电视;
    }
}
 

解决方案

这似乎是在 RecyclerView 中的错误,有报道<一href="https://$c$c.google.com/p/android/issues/detail?can=1&q=77846&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&id=77846">here和这里。希望这将是固定在下一版本中。

I'm using RecyclerView to display name of the items. My row contains single TextView. Item names are stored in List<String> mItemList.

To change contents of RecyclerView, I replace Strings in mItemList and call notifyDataSetChanged() on RecyclerViewAdapter.

But If I try to change contents of the mItemList while RecyclerView is scrolling, sometimes it gives me java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588

This happens if size of mItemList is less than before. So what is the correct way to change contents of the RecyclerView ? Is this a bug in RecyclerView ?

Here's full stack trace of Exception:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)
        at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:524)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        at dalvik.system.NativeStart.main(Native Method)

AdapterView code:

private static class FileListAdapter extends RecyclerView.Adapter<FileHolder> {
    private final Context mContext;
    private final SparseBooleanArray mSelectedArray;
    private final List<String> mList;

    FileListAdapter(Context context, List<String> list, SparseBooleanArray selectedArray) {
        mList = list;
        mContext = context;
        mSelectedArray = selectedArray;
    }


    @Override
    public FileHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.file_list_item, viewGroup, false);

        TextView tv = (TextView) view
                .findViewById(R.id.file_name_text);
        Typeface font = Typeface.createFromAsset(viewGroup.getContext().getAssets(),
                viewGroup.getContext().getString(R.string.roboto_regular));
        tv.setTypeface(font);

        return new FileHolder(view, tv);
    }

    @Override
    public void onBindViewHolder(FileHolder fileHolder, final int i) {

        String name = mList.get(i);

        // highlight view if selected
        setSelected(fileHolder.itemView, mSelectedArray.get(i));

        // Set text
        fileHolder.mTextView.setText(name);
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }
}

private static class FileHolder extends RecyclerView.ViewHolder {

    public final TextView mTextView;

    public FileHolder(View itemView, TextView tv) {
        super(itemView);
        mTextView = tv;
    }
}

解决方案

It seems to be a bug in RecyclerView, it's reported here and here. Hopefully it will be fixed in the next release.

这篇关于如何滚动时改变RecyclerView内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆