java.lang.IndexOutOfBoundsException: обнаруженное несоответствие выдается, когда я начинаю прокручивать в своем приложении - PullRequest
0 голосов
/ 24 июня 2019

У меня есть просмотр карты, где я загружаю текстовые просмотры динамически в зависимости от того, соответствуют они определенным критериям или нет. Как вы можете видеть из моего кода ниже, у меня есть 2 условия в onBindViewHolder. Первый из них всегда будет производить 1 просмотр текста, если он встречен. Итак, у меня есть 1 карта со значением mPurchaseDateList, значением mVehicleList. Это может производить несколько карт с этой структурой. Мое второе условие ВСЕГДА будет производить 1 карту со значением от mPurchaseDateList, а МНОГОКРАТНЫЕ значения от mVehicleList в зависимости от того, сколько раз было «Вчера». Позиции значений в списке уже отсортированы так, как мне нужно, и количество в обоих списках всегда будет одинаковым. Я достигаю того, что мне нужно, с помощью кода ниже, однако, когда я прокручиваю вниз, я получаю сообщение об ошибке. Я думаю, что это потому, что я удаляю данные из списка, как только я добавил их, чтобы избежать дублирования.

public DataAdapter(MainActivity activity, ArrayList<String> mVehicleList, ArrayList<String> mPurchaseDateList) {
    this.mActivity = activity;
    this.mVehicleList= mVehicleList;
    this.mPurchaseDateList= mPurchaseDateList;
    countPurchaseDateList();
}

    private LinearLayout llVehicleName;
    private TextView tv_PurchaseDate;


    public MyViewHolder(View view) {
        super(view);
        llVehicleName = (LinearLayout) view.findViewById(R.id.row_tv_vehicle_name);
        tv_PurchaseDate = (TextView) view.findViewById(R.id.row_tv_purchase_date);
    }
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.activity_row_data, parent, false);

    return new MyViewHolder(itemView);
}
 @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        //the header
        holder.tv_PurchaseDate.setText(mPurchaseDateList.get(position));

            if (mPurchaseDateList.get(position).equalsIgnoreCase("Today")) {

                addTextViews(holder, position);

            }
            if (mPurchaseDateList.get(position).equalsIgnoreCase("Yesterday")) {

                for(int i=0;i < yesterdayCounter;i++) {

                    addTextViews(holder, position);

                    //remove the vehicle and date to avoid duplicates
                    mVehicleList.remove(position);
                    mPurchaseDateList.remove(position);
                }

            }

    }

Следующий метод добавляет мое текстовое представление (или несколько экземпляров в зависимости от того, сколько раз "Yesterday" присутствует в mPurchaseDateList)

   private void addTextViews(MyViewHolder holder, final int position) {

        RecyclerView.LayoutParams lparams = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT);
        TextView tv = new TextView(holder.llVehicleName.getContext());
        tv.setLayoutParams(lparams);
        tv.setText(mVehicleList.get(position));
        holder.llVehicleName.addView(tv);

    }

Следующий метод сообщает мне, сколько раз "Yesterday" присутствует:

public void countPurchaseDateList () {
    for(int i=0; i < mPurchaseDateList.size(); i++)
    if (mPurchaseDateList.get(i).equalsIgnoreCase("Yesterday")) {
        yesterdayCounter++;
    }
}

Ошибка, вызванная прокруткой вниз:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mySampleProject, PID: 11262
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{c91c8a2 position=7 id=-1, oldPos=-1, pLpos:-1 no parent} android.support.v7.widget.RecyclerView{47ff933 VFED..... ........ 0,0-1440,2432 #7f070006 app:id/act_recyclerview}, adapter:com.mySampleProject.DataAdapter@8dcd4f0, layout:android.support.v7.widget.LinearLayoutManager@87fa69, context:com.mySampleProject.Activity.MainActivity@d943958
        at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1331)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1075)
        at android.support.v7.widget.RecyclerView.scrollStep(RecyclerView.java:1832)
        at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1927)
        at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:3187)
        at android.view.View.dispatchTouchEvent(View.java:12513)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
        at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
        at android.view.View.dispatchPointerEvent(View.java:12752)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
        at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
        at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:177)
        at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7166)
        at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7218)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:690)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
...