对于RecyclerView的项目视图,TransitionManager beginDelayedTransition存在问题

时间:2017-02-05 22:48:23

标签: java android android-transitions

我有以下代码:

...
<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"
       android:layout_marginTop="8dp" android:layout_marginBottom="8dp">
    <ImageView android:id="@+id/image_product"
            android:layout_width="64dp" android:layout_height="64dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="8dp"/>
    <FrameLayout android:id="@+id/view_price"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="8dp" android:layout_marginRight="8dp">
        <Button style="@style/Button.Border.Green"
                android:id="@+id/button_price"
                android:minWidth="76dp"/>
        <Button style="@style/Button.Flat.Green"
                android:id="@+id/button_add_to_cart_or_customize"
                android:layout_width="wrap_content"
                android:minWidth="76dp"
                android:minHeight="48dp"
                android:textSize="13sp"/>
    </FrameLayout>
    <TextView android:id="@+id/text_product"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_toRightOf="@id/image_product" android:layout_toLeftOf="@id/view_price"
            android:layout_centerVertical="true"
            android:layout_marginLeft="16dp"
            android:textAppearance="@style/TextAllerRegular.13sp.Black87per"/>
</RelativeLayout>

RecyclerView的项目布局:

changePriceButton/resetPriceButton

我想在用户点击价格时将更改价格按钮设置为“添加到购物车”,并在用户开始滚动RecyclerView时返回到价格。

当用户单击按钮并滚动recyclelerview时,按钮动画可以在中间状态停止。您将看到窗口右侧和价格按钮之间的边距,或文本“添加到购物车”而没有按钮上的右侧填充。 然后该按钮将被破坏,您可以在其上尝试TransitionManager,但按钮将无法完全显示。

Wrong UI state

使用“Animator持续时间刻度”&gt; = 5x很容易重现此错误。

beginDelayedTransition已经在此视图上启动beginDelayedTransition时,TransitionManager似乎有问题。 另外我认为TransitionManager.endTransitions((ViewGroup) itemView)在回收滚动时回收了RecyclerView的视图。在onBindViewHolder开头尝试isResetPriceButton,但没有帮助。

以下为我解决了这个问题,但我不确定。 很好地调查问题的原因。

我在RecyclerView的holder中添加了字段private boolean isResetPriceButton; @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { isResetPriceButton = false; ... resetPriceButton(false); } void changePriceButton(int titleRes) { if (isResetPriceButton) { isResetPriceButton = false; TransitionManager.beginDelayedTransition((ViewGroup) itemView); buttonPrice.setVisibility(View.GONE); buttonAddToCartOrCustomize.setVisibility(View.VISIBLE); buttonAddToCartOrCustomize.setText(titleRes); } } void resetPriceButton(boolean withTransition) { if (!isResetPriceButton) { isResetPriceButton = true; if (withTransition) { TransitionUtils.beginDelayedTransitionIfPossible((ViewGroup) itemView); } buttonPrice.setVisibility(View.VISIBLE); buttonAddToCartOrCustomize.setVisibility(View.GONE); } } ,以防止在用户开始滚动RecycleView时尝试将按钮更改为相同的状态

setHasTransientState

我在转换期间在持有者的视图中使用transition.addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { itemView.setHasTransientState(true); } @Override public void onTransitionEnd(Transition transition) { itemView.setHasTransientState(false); } @Override public void onTransitionCancel(Transition transition) { itemView.setHasTransientState(false); } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } }); 。但是我不喜欢这个,它在转换开始时会产生额外的滚动视图。

{{ portfolio.currentValue | currency : 'AUD' : true : '4.0' }}

0 个答案:

没有答案