Библиотека сворачивания ячеек Android не получает правильную ширину при прокрутке ячейки в режиме рециркуляции - PullRequest
1 голос
/ 03 октября 2019

У меня есть recyclerView, состоящий из складывающихся ячеек.

(библиотеку можно найти здесь: https://github.com/Ramotion/folding-cell-android

можно щелкнуть по каждому элементу в recyclerView, и этобудет разворачиваться как бумага. onBindViewHolder имеет условие, чтобы проверить, был ли элемент, появляющийся на экране, был предварительно свернут или развернут, чтобы правильно видеть состояние ячейки:

public class FoldingCellListAdapter extends RecyclerView.Adapter<FoldingCellListAdapter.ViewHolder> {
 @NonNull
    @Override
    public FoldingCellListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        // Inflate the folding cell layout for each individual adapter element on screen
        FoldingCell cellView = (FoldingCell) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_elements, parent, false);

        // passing the current infalted element to a holder
        ViewHolder viewHolder = new ViewHolder(cellView);

        // bind a click listener to the folding cell
        viewHolder.bind(onCardClickListener);


        return viewHolder;
    }



    @Override
    public void onBindViewHolder(@NonNull FoldingCellListAdapter.ViewHolder holder, int position) {

        Log.i(TAG, "bind view "  + position);

        // to set some text and images to the element
        bindLocationData(holder, position);

        // if this cell was previously opened/unfolded
        if (unfoldedIndexes.contains(position)) {
            //unfold it without animation to appear instantly unfolded
            holder.cell.unfold(true);

        } else {

            holder.cell.fold(true);

        }

    }
}

Затем я запускаюкод для просмотра элементов в представлении реселлера. Затем я нажимаю на первый элемент, чтобы ячейка была развернута. Теперь все работает до сих пор.

Если затем прокрутить вверх, чтобы удалить развернутый первый элемент с экрана, тоЯ мгновенно пытаюсь вернуть его на экран, появляется следующая ошибка:

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fcellTest, PID: 7731
    java.lang.IllegalArgumentException: width and height must be > 0
        at android.graphics.Bitmap.createBitmap(Bitmap.java:1113)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:1080)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:1030)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:991)
        at com.ramotion.foldingcell.FoldingCell$override.measureViewAndGetBitmap(FoldingCell.java:362)
        at com.ramotion.foldingcell.FoldingCell$override.access$dispatch(Unknown Source:260)
        at com.ramotion.foldingcell.FoldingCell.measureViewAndGetBitmap(Unknown Source:23)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.tools.ir.runtime.AndroidInstantRuntime.invokeProtectedMethod(AndroidInstantRuntime.java:143)
        at com.ramotion.foldingcell.FoldingCell$override.unfold(FoldingCell.java:135)
        at com.ramotion.foldingcell.FoldingCell$override.access$dispatch(Unknown Source:277)
        at com.ramotion.foldingcell.FoldingCell.unfold(Unknown Source:20)
        at adapters.FoldingCellListAdapter.onBindViewHolder(FoldingCellListAdapter.java:139)
        at adapters.FoldingCellListAdapter.onBindViewHolder(FoldingCellListAdapter.java:119)
        at adapters.FoldingCellListAdapter.onBindViewHolder(FoldingCellListAdapter.java:24)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at androidx.recyclerview.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1331)
        at androidx.recyclerview.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1075)
        at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:1832)
        at androidx.recyclerview.widget.RecyclerView.scrollByInternal(RecyclerView.java:1927)
        at androidx.recyclerview.widget.RecyclerView.onTouchEvent(RecyclerView.java:3187)
        at android.view.View.dispatchTouchEvent(View.java:13417)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3054)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2741)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:460)
E/AndroidRuntime:     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1849)
        at android.app.Activity.dispatchTouchEvent(Activity.java:3974)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:418)
        at android.view.View.dispatchPointerEvent(View.java:13676)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5479)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5282)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4785)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4838)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4804)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4944)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4812)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5001)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4785)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4838)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4804)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4812)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4785)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7502)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7471)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7432)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7627)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
        at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
        at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:178)
        at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7578)
        at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7651)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
        at android.view.Choreographer.doCallbacks(Choreographer.java:790)
        at android.view.Choreographer.doFrame(Choreographer.java:718)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7319)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)

Странно то, что эта ошибка не возникает, если после разворачивания первого элемента я продолжаю прокручивать до 9-гоэлемент, а затем снова прокрутите вверх до первого.Ошибка исчезает, и первый элемент отображается развернутым, как ожидалось.

Проблемы, кажется, сБиблиотека FoldingCell, вызывающая getMeasuredWidth() при вызове метода unfold(true).

Как мне решить эту проблему? Я также скачал библиотеку, так как считаю, что ошибка может быть в самой библиотеке, но, насколько я искал в Интернете, пока никто не нашел решения, хотя проблема возникает и для других людей.

(Похоже, что библиотека не была хорошо протестирована с RecyclerView)

...