使用viewholder后,此列表视图仍然滞后

时间:2016-07-08 13:29:54

标签: android listview custom-adapter android-viewholder

以下是customadapter文件的代码。我正在使用正则表达式来操纵字符串。它是一个音乐播放器应用程序,此代码显示歌曲的名称和它的艺术家的名字,但它在滚动时滞后。

customAdapter.java

 import android.app.Activity;
    import android.media.MediaMetadataRetriever;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.TextView;

    import java.util.List;

    public class customAdapter extends ArrayAdapter <String> {
    static class ViewHolder {
        TextView songName;
        TextView artistName;
        int position;
    }

    LayoutInflater inflater;

    public customAdapter(Activity context, List <String> songList) {
        super(context, 0, songList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String song = getItem(position);
        final ViewHolder holder;
        MediaMetadataRetriever metaRetriver = new MediaMetadataRetriever();

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.song, parent, false);
            holder.songName = (TextView) convertView.findViewById(R.id.list_item_song_name);
            holder.artistName = (TextView) convertView.findViewById(R.id.list_item_artist_name);
            convertView.setTag(holder);
        }

        else
            holder = (ViewHolder) convertView.getTag();

        try {

            metaRetriver.setDataSource(song);

            try {
                String[] temps = song.split("/");
                String temp = temps[temps.length - 1];
                temp = temp.replaceAll("\\s*\\([^\\)]*\\)\\s*", "");
                temp = temp.replaceAll("\\[.*?\\]", "");
                holder.songName.setText(temp.substring(0, temp.length() - 4));
            }

            catch (Exception e) {
                holder.songName.setText("Unknown");
            }

            try {
                String temp = metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
                temp = temp.replaceAll("\\s*\\([^\\)]*\\)\\s*", "");
                if(temp.equals(""))
                    holder.artistName.setText("Unknown");
                else
                    holder.artistName.setText(temp);
            }

            catch (Exception e) {
                holder.artistName.setText("Unknown");
            }
        }

        catch (Exception e) {

        }

        return convertView;
    }
   }

请帮助!!

1 个答案:

答案 0 :(得分:3)

String temp = metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);

在每个getView()调用中,您正在主应用程序线程上执行IPC和磁盘I / O.不要这样做。在填充列表或异步加载之前预先获取此信息(Picasso和其他图像加载库异步加载ImageView行中使用的ListView的图像的方式。)

此外,不记录异常而不记录异常。在Log.e()块中添加catch (Exception e)语句或其他内容。