У меня есть 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
)