以下是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;
}
}
请帮助!!
答案 0 :(得分:3)
String temp = metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
在每个getView()
调用中,您正在主应用程序线程上执行IPC和磁盘I / O.不要这样做。在填充列表或异步加载之前预先获取此信息(Picasso和其他图像加载库异步加载ImageView
行中使用的ListView
的图像的方式。)
此外,不记录异常而不记录异常。在Log.e()
块中添加catch (Exception e)
语句或其他内容。