android中的ListView在占位短时滚动非常慢

Posted

技术标签:

【中文标题】android中的ListView在占位短时滚动非常慢【英文标题】:ListView in android scroll very slow when they take a short place 【发布时间】:2019-12-17 22:56:37 【问题描述】:

请,只有 3 个文本视图(没有图像)的列表视图在全屏显示高度和宽度时工作得非常好。 在我将其更改为屏幕高度的一半后,它的滚动变得非常缓慢。

listView 中行的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="4dp"
        android:layout_marginEnd="16dp"
        android:layout_toStartOf="@id/timer_row">
            <TextView
                android:id="@+id/name_row"
                android:layout_
                android:layout_
                android:textStyle="bold"
                android:textSize="@dimen/main_title_size"
                android:textColor="@color/white"
                 />
            <TextView
                android:id="@+id/author_row"
                android:layout_
                android:layout_
                android:textSize="@dimen/main_timer_size"
                android:textColor="@color/white"
                android:layout_below="@id/name_row"
                android:layout_marginTop="16dp"
                android:layout_alignParentStart="true"/>
    </RelativeLayout>
    <TextView
        android:id="@+id/timer_row"
        android:layout_
        android:layout_
        android:textSize="@dimen/main_timer_size"
        android:layout_margin="16dp"
        android:padding="8dp"
        android:textAlignment="center"
        android:textColor="@color/white"
        android:gravity="center"
        android:layout_centerVertical="true"
        android:layout_alignParentEnd="true"/>
</RelativeLayout>

以及带有视图的适配器

public class MusicAdapter extends BaseAdapter 

    private ArrayList<Music> list;
    private LayoutInflater layoutInflater;

    MusicAdapter(Context context, ArrayList<Music> list) 
        this.list = list;
        layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    @Override
        public int getCount() 
            return list.size();
        

        @Override
        public Object getItem(int position) 
            return list.get(position);
        

        @Override
        public long getItemId(int position) 
            return 0;
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            ViewHolder viewHolder;

            if (convertView == null) 
                convertView = layoutInflater.inflate(R.layout.music_row, parent, false);
                viewHolder = new ViewHolder(convertView);
                convertView.setTag(viewHolder);
             else 
                viewHolder = (ViewHolder) convertView.getTag();
            

            Music music = (Music) getItem(position);
            viewHolder.title.setText(music.getName());
            viewHolder.author.setText(music.getAuthor());
            viewHolder.timer.setText(music.getTimer());

            return convertView;
        


        static class ViewHolder
        TextView title,author,timer;
        ViewHolder(View v)
        
            this.title = v.findViewById(R.id.name_row);
            this.author = v.findViewById(R.id.author_row);
            this.timer = v.findViewById(R.id.timer_row);
        
        
    

【问题讨论】:

【参考方案1】:

您应该尝试使用 RecyclerView 而不是 ListView:https://developer.android.com/guide/topics/ui/layout/recyclerview

【讨论】:

我之前确实使用过 RecyclerView,但它有些问题 在不实际运行代码的情况下很难调试此类问题。您可以通过切换到RecyclerView 来提高性能,使用ConstraintLayout 而不是RelativeLayout 作为列表项,确保您的onBindViewHolder 尽可能轻量级(例如:不要使用MediaMetadataRetriever 来获取持续时间因为它很慢,...)。您可以使用分析器调试您的应用性能:developer.android.com/studio/profile/android-profiler

以上是关于android中的ListView在占位短时滚动非常慢的主要内容,如果未能解决你的问题,请参考以下文章

Viewpager Fragment中的Android Listview-不滚动

ScrollView 中的 ListView 在 Android 上不滚动

提高 Android ListView 中的滚动平滑度

listitem中的Android listview imageview在滚动时隐藏

listitem中的Android listview imageview在滚动时隐藏

Android:Listview 反弹到滚动视图