在棉花糖中ListView滚动与图像变慢

时间:2016-11-01 09:19:42

标签: android listview android-6.0-marshmallow

我有一个ListView,其中ImageView覆盖了该行。 (我正在用Picasso加载图片。我先试过滑行,但Picasso稍快一点)它在棒棒糖和kitkat上运行得很顺利,但在棉花糖上滚动速度非常慢,有时它会得到ANR信息。

这是列表项的xml:

<RelativeLayout   xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:clipChildren="false"
       android:clipToPadding="false">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="170dp">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/img_genre_bg"
                    android:scaleType="fitXY"/>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <!--android:background="@color/trans_black"-->

                <RelativeLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true">

                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/img_play"
                        android:layout_centerHorizontal="true"
                        android:src="@drawable/play_button"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/tv_genre_name"
                        android:textSize="20sp"
                        android:textAllCaps="true"
                        android:layout_centerHorizontal="true"
                        android:textColor="@color/white"
                        android:layout_below="@+id/img_play"/>
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/tv_genre_id"
                        android:visibility="gone"/>
                </RelativeLayout>


                <View
                    android:layout_width="match_parent"
                    android:layout_height="3dp"
                    android:background="@color/colorAccent"
                    android:layout_alignParentBottom="true"/>
            </RelativeLayout>

        </RelativeLayout>

列表视图:

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lv_genre"
    android:scrollbars="none"
    android:divider="@null"
    android:cacheColorHint="@android:color/transparent"
    android:fastScrollEnabled="true"
    android:persistentDrawingCache="scrolling"
    android:scrollingCache="false">
</ListView>

getView():

public View getView(int position, View view, ViewGroup viewGroup) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    View rowview=view;
    if(rowview==null){
        rowview=inflater.inflate(R.layout.item_genre_list,viewGroup,false);
    }
    id = (TextView) rowview.findViewById(R.id.tv_genre_id);
    TextView name = (TextView) rowview.findViewById(R.id.tv_genre_name);
    ImageView img_genre_bg = (ImageView) rowview.findViewById(R.id.img_genre_bg);
    ImageView img_play = (ImageView) rowview.findViewById(R.id.img_play);


    opensans = Typeface.createFromAsset(context.getAssets(), "font/OpenSans-Light.ttf");
    name.setTypeface(opensans);

    GENRE genre=new GENRE();
    genre=genres.get(position);
    id.setText(genre.getGenre_id());
    name.setText(genre.getGenre_name());


        Picasso
            .with(context)
            .load(genre.getGenre_image())
            .placeholder(R.drawable.loading)
            .into(img_genre_bg);

    return rowview;
}

我曾尝试在单独的AsyncTask线程上加载图像,但仍然卡在滚动上。将其更改为RecyclerView也没有帮助。

1 个答案:

答案 0 :(得分:1)

这是因为每次创建行时都会创建Typeface。每次创建一行时创建Asset的开销可能会减慢执行速度。

将此段代码移至您班级的Constructor;

opensans = Typeface.createFromAsset(context.getAssets(), "font/OpenSans-Light.ttf");

然后您可以将已创建的类型用作:

name.setTypeface(opensans);

最好转移到更适合的RecyclerView,因为它比ListView更有效地管理内存。