clearAnimation()解决setVisibility()无效问题

跟甜同学一起搞一个退场动画,第一次播放没问题,第二次播放就发现有个view会先闪出来一下,然后再执行从0到1的alpha动画。但是代码里明明已经用setVisibility(INVISIBLE)隐藏这个view了,为什么没有生效呢?Google了一下,有人说要调一下clearAnimation(),试了一下果然好了。。。

那么为什么加上这句就好了呢?得去看看framework的代码了,首先看一下View的clearAnimation():

    public void clearAnimation() {
        if (mCurrentAnimation != null) {
            mCurrentAnimation.detach();
        }
        mCurrentAnimation = null;
        invalidateParentIfNeeded();
    }
主要就是把mCurrentAnimation这个变量置空。这个变量是protected类型的,外面使用的话要通过getAnimation()这个接口:

    public Animation getAnimation() {
        return mCurrentAnimation;
    }
搜了一下发现ViewGroup的dispatchDraw()里用到了这个方法来判断是否要drawChild(),如果getAnimation()不为空,即使mViewFlags不是VISIBLE也要画:

    protected void di
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListView的setEmptyView方法是用来设置列表为空时显示的View,但是有时候我们在使用该方法时发现并没有生效,可能是以下几个原因: 1. 没有给ListView设置Adapter,因为只有当Adapter没有数据时才会显示EmptyView。 2. 在设置EmptyView之前已经给ListView设置了数据源,需要在设置EmptyView之前将数据源清空。 3. 在设置EmptyView之前需要先inflate出EmptyView的布局,并将其添加到ListView的父布局中。 以下是一个setEmptyView无效的例子: ```java ListView listView = findViewById(R.id.list_view); View emptyView = findViewById(R.id.empty_view); listView.setEmptyView(emptyView); String[] data = {"item1", "item2", "item3"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); ``` 上述代码中,设置了EmptyView,但是并没有生效,因为在设置EmptyView之前已经给ListView设置了数据源,需要将数据源清空,即在setAdapter之前添加如下代码: ```java listView.setAdapter(null); ``` 另外,还需要注意,EmptyView需要先inflate出来并添加到ListView的父布局中,例如: ```java View emptyView = LayoutInflater.from(this).inflate(R.layout.empty_view, (ViewGroup) listView.getParent(), false); ``` 至于ListView的源码实现,可以参考以下几个方法: 1. setEmptyView方法: ```java public void setEmptyView(View emptyView) { mEmptyView = emptyView; final T adapter = mAdapter; final boolean empty = ((adapter == null) || adapter.isEmpty()); updateEmptyStatus(empty); } private void updateEmptyStatus(boolean empty) { if (isInFilterMode()) { empty = false; } if (empty) { if (mEmptyView != null) { mEmptyView.setVisibility(View.VISIBLE); setVisibility(View.GONE); } else { // If the caller just removed our empty view, make sure the list view is visible setVisibility(View.VISIBLE); } // We are now GONE, so pending layouts will not be dispatched. // Force one here to ensure that the state of the list matches // the state of the adapter. if (mDataChanged) { this.onLayout(false, getLeft(), getTop(), getRight(), getBottom()); } } else { if (mEmptyView != null) { mEmptyView.setVisibility(View.GONE); } setVisibility(View.VISIBLE); } } ``` 2. setAdapter方法: ```java public void setAdapter(ListAdapter adapter) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(mDataSetObserver); resetList(); } mAdapter = adapter; if (mAdapter != null) { mOldSelectedPosition = INVALID_POSITION; mOldSelectedRowId = INVALID_ROW_ID; mItemCount = mAdapter.getCount(); mDataChanged = true; // Detect the case where a cursor that was previously invalidated has // been repopulated with new data. mHasStableIds = mAdapter.hasStableIds(); if (mChoiceMode != CHOICE_MODE_NONE && mAdapter.hasStableIds()) { mChoiceMode = CHOICE_MODE_SINGLE; if (mCheckStates == null) { mCheckStates = new SparseBooleanArray(); } if (mCheckedIdStates == null) { mCheckedIdStates = new LongSparseArray<Boolean>(); } } if (!mPopupHidden) { // Show the popup if we have one if (mAdapter.getCount() > 0) { showPopup(); } } } else { mItemCount = 0; mDataChanged = false; mHasStableIds = false; mOldSelectedPosition = INVALID_POSITION; mOldSelectedRowId = INVALID_ROW_ID; mChoiceMode = CHOICE_MODE_NONE; mCheckStates.clear(); mCheckedIdStates.clear(); // Hide the currently visible popup dismissPopup(); } if (mFilter != null) { mAdapter.getFilter().filter(mFilter); } requestLayout(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值