如何在经常请求布局时防止ListView闪烁

时间:2014-09-19 17:31:32

标签: android performance android-layout listview

我正在实现一个“视差”效果,它包含上面的列表视图和图像视图。 当用户向下滚动时,从图像视图的高度中减去偏移量。这很好用。我在列表视图的滚动侦听器中执行此操作。要真实地实时更新listview和imageview,我需要调用requestLayout()

问题是,这个方法是异步的,如果我慢慢滚动它会非常闪烁。如果我只是快速滑动它看起来非常好。还有其他解决方案可以解决这个问题吗?

ScrollListener

@Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            View c = view.getChildAt(0);
            int top = (c == null) ? 0 : (-c.getTop() + view.getFirstVisiblePosition() * c.getHeight());
            //Log.d(TAG, "Offset = " + top);
            mImageView.getLayoutParams().height = 400 - top;
            mImageView.requestLayout();
        }

布局

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            tools:context="xxx.fragments.NewsFragment">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@android:color/holo_blue_light"
    android:id="@+id/advertisement"
    />

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/news_feed">

</ListView>

</TableLayout>

enter image description here

1 个答案:

答案 0 :(得分:2)

如果您只想让ImageView滚动列表,那么您只需add it as a header view

listView.addHeaderView(mImageView);

确保在调用setAdapter之前调用此方法。另外,请确保您的ImageView还没有父级,因此请单独对其进行充气,或者只使用new ImageView在代码中创建一个。