android中的ListView在短时间内滚动速度非常慢

android中的ListView在短时间内滚动速度非常慢,android,performance,listview,scroll,Android,Performance,Listview,Scroll,请注意,listview只有3个文本视图(没有图像),当它在高度和宽度上全屏显示时,它工作得非常好。 在我把它改成占据屏幕一半高度后,它的滚动速度变得非常慢 listView中的行布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent

请注意,listview只有3个文本视图(没有图像),当它在高度和宽度上全屏显示时,它工作得非常好。 在我把它改成占据屏幕一半高度后,它的滚动速度变得非常慢

listView中的行布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        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_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textSize="@dimen/main_title_size"
                android:textColor="@color/white"
                 />
            <TextView
                android:id="@+id/author_row"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                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_width="wrap_content"
        android:layout_height="wrap_content"
        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>

以及带有viewholder的适配器

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);
        }
        }
    }
公共类MusicAdapter扩展BaseAdapter{
私有数组列表;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
MusicAdapter(上下文,数组列表){
this.list=列表;
layoutInflater=(layoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int位置){
返回列表。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.music_行,父项,false);
viewHolder=新的viewHolder(转换视图);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
音乐=(音乐)获取项目(位置);
viewHolder.title.setText(music.getName());
viewHolder.author.setText(music.getAuthor());
viewHolder.timer.setText(music.getTimer());
返回视图;
}
静态类视窗夹{
文本视图标题、作者、计时器;
视图支架(视图v)
{
this.title=v.findviewbyd(R.id.name\u行);
this.author=v.findviewbyd(R.id.author\u行);
this.timer=v.findviewbyd(R.id.timer\u行);
}
}
}

您应该尝试使用RecyclerView而不是ListView:

您应该尝试使用RecyclerView而不是ListView:

我以前确实使用过RecyclerView,但它存在一些问题如果不实际运行代码,很难调试此类问题。您可以通过切换到
RecyclerView
,使用
ConstraintLayout
而不是
RelativeLayout
来提高性能。对于列表项,请确保您的
onBindViewHolder
尽可能轻量级(例如:不要使用
MediaMetadataRetriever
获取持续时间,因为它非常慢,…)。您可以使用profiler调试您的应用程序性能:我以前确实使用过RecyclerView,但它存在一些问题如果不实际运行代码,很难调试此类问题。您可以通过切换到
RecyclerView
,使用
ConstraintLayout
而不是
RelativeLayout
来提高性能。对于列表项,请确保您的
onBindViewHolder
尽可能轻量级(例如:不要使用
MediaMetadataRetriever
获取持续时间,因为它非常慢,…)。您可以使用探查器调试应用程序性能: