別の日、別の質問!私は現在、学校の授業のために音楽プレーヤーを作っています。私のリストビューを作成して作成した1日目から、リストビューは狂ったように遅れていました。数日前、私はLruCacheで画像をキャッシュし始めましたが、パフォーマンスの向上は見られませんでした。今日私はViewHoldersで追加しましたが、パフォーマンスの向上はまったくありません。ViewHolderとキャッシュされた画像を使用したListViewの遅れ
私のリストビューでは、フォルダアイテムまたは曲アイテムのいずれかを表示できます。フォルダアイテムは、(2つのテキストビューの横の)ビュー内にアルバムイメージを取得します。現在、私の描画可能なリソース(サイズ範囲は15KBから55KBまで)から描画されたハードコーディングされたイメージです。曲目には4つのTextViewしかありません。リストに曲目だけがあるとき、遅れは少し少なくなりますが、まだまだです。
現在、ListViewには最大約10個のアイテムがあります。 Underneathは、リストを作成するために使用されるArrayAdapterです。私はAndroidにはとても新しいので、問題に関連していない場合でも、どんなヘルプやヒントも感謝しています。
public class SongAdapter extends ArrayAdapter{
private final LruCache<String, Bitmap> cache;
private ArrayList<Integer> myFolderSongCounts;
ViewHolderSongs holderSongs;
ViewHolderFolders holderFolders;
public SongAdapter(Context context, List objects, ArrayList<Integer> folderSongCounts) {
super(context, 0, objects);
myFolderSongCounts = folderSongCounts;
/*
*
* CACHE EXAMPLE FROM
* https://stackoverflow.com/questions/15586977/listview-scroll-lagging-when-images-is-shown
* BY USER Lam Do
*
* */
final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024);
// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory/8;
cache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// The cache size will be measured in kilobytes rather than
// number of items.
return bitmap.getRowBytes()/1024;
}
};
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
File song = (File) getItem(position);
Log.d("SongAdapter Position: ", ""+ position);
Listen main = (Listen) getContext().getApplicationContext();
Typeface custom_font = main.getCustom_font();
//if its an mp3 file, show a song list item
if(song.getName().substring(song.getName().length()-4,song.getName().length()).equals(".mp3")) {
Mp3File mp3file = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(song.getPath());
try {
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.songs_list_item, parent, false);
holderSongs = new ViewHolderSongs();
holderSongs.txt_song_album = (TextView) convertView.findViewById(R.id.song_album);
holderSongs.txt_song_artist = (TextView) convertView.findViewById(R.id.song_artist);
holderSongs.txt_song_duration = (TextView) convertView.findViewById(R.id.song_duration);
holderSongs.txt_song_name = (TextView) convertView.findViewById(R.id.song_name);
convertView.setTag(holderSongs);
}
else {
holderSongs = (ViewHolderSongs) convertView.getTag();
}
mp3file = new Mp3File(song);
String album = mp3file.getId3v2Tag().getAlbum();
String artist = mp3file.getId3v2Tag().getAlbumArtist();
int durationInMilliseconds = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
int durationInSeconds = durationInMilliseconds/1000;
int durationMinutes = durationInSeconds/60;
String durationSeconds = (durationInSeconds%60 > 10) ? "" + durationInSeconds%60 : "0" + durationInSeconds%60;
String duration = durationMinutes + ":" + durationSeconds;
holderSongs.txt_song_name.setText(song.getName().substring(0, song.getName().length() - 4));
holderSongs.txt_song_album.setText(getValidValue(album, "undefined"));
holderSongs.txt_song_artist.setText(getValidValue(artist, "undefined"));
holderSongs.txt_song_duration.setText(getValidValue(duration, "0:00"));
holderSongs.txt_song_name.setTypeface(custom_font);
holderSongs.txt_song_album.setTypeface(custom_font);
holderSongs.txt_song_artist.setTypeface(custom_font);
holderSongs.txt_song_duration.setTypeface(custom_font);
} catch (IOException e) {
e.printStackTrace();
} catch (UnsupportedTagException e) {
e.printStackTrace();
} catch (InvalidDataException e) {
e.printStackTrace();
}
}
//if its a folder, show a folder list item
else {
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.folders_list_item, parent, false);
holderFolders = new ViewHolderFolders();
holderFolders.amount_of_songs = (TextView)convertView.findViewById(R.id.amount_of_songs);
holderFolders.folder_name = (TextView)convertView.findViewById(R.id.folder_name);
holderFolders.folder_image = (ImageView)convertView.findViewById(R.id.folder_image);
convertView.setTag(holderFolders);
}
else {
holderFolders = (ViewHolderFolders) convertView.getTag();
}
int amountOfSongs = myFolderSongCounts.get(position);
holderFolders.folder_name.setText(song.getName());
holderFolders.amount_of_songs.setText(amountOfSongs + " songs");
holderFolders.folder_name.setTypeface(custom_font);
holderFolders.amount_of_songs.setTypeface(custom_font);
if(position == 0){
Bitmap bmp = getBitmapFromMemCache("perfectlychilled");
if (bmp == null) {
bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.perfectly_chilled);
addBitmapToMemoryCache("perfectlychilled", bmp);
}
holderFolders.folder_image.setImageBitmap(bmp);
}
else if(position == 1){
Bitmap bmp = getBitmapFromMemCache("insurgency");
if (bmp == null) {
bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.insurgency);
addBitmapToMemoryCache("insurgency", bmp);
}
holderFolders.folder_image.setImageBitmap(bmp);
}
else {
Bitmap bmp = getBitmapFromMemCache("default");
if (bmp == null) {
bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.folderdefault);
addBitmapToMemoryCache("default", bmp);
}
holderFolders.folder_image.setImageBitmap(bmp);
}
}
return convertView;
}
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
cache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemCache(String key) {
return cache.get(key);
}
static class ViewHolderSongs {
TextView txt_song_name;
TextView txt_song_album;
TextView txt_song_artist;
TextView txt_song_duration;
}
static class ViewHolderFolders {
TextView folder_name;
TextView amount_of_songs;
ImageView folder_image;
}
}
songs_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_margin="0dp"
android:padding="0dp"
android:background="@color/backgroundGray"
android:gravity="center_vertical"
android:layout_height="70dp">
<TextView
android:text="TextView"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:paddingLeft="15dp"
android:paddingRight="20dp"
android:id="@+id/song_name"
android:textColor="@color/textBlack"
android:maxLines="1"
android:layout_marginBottom="8dp"
android:ellipsize="end" />
<TextView
android:text="3:26"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:textAlignment="textEnd"
android:paddingRight="15dp"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/textBlack"
android:layout_toRightOf="@id/song_name"
android:id="@+id/song_duration"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/song_artist"
android:textColor="@color/textGray"
android:width="190dp"
android:gravity="bottom"
android:maxLines="1"
android:ellipsize="end"
android:layout_below="@id/song_name"
android:paddingRight="20dp"
android:paddingLeft="15dp"
android:text="Sabaton" />
<TextView
android:text="Hell is upon us"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/textGray"
android:width="190dp"
android:id="@+id/song_album"
android:paddingRight="15dp"
android:textAlignment="textEnd"
android:maxLines="1"
android:ellipsize="end"
android:layout_below="@id/song_name"
android:layout_toRightOf="@id/song_artist"
/>
</RelativeLayout>
folders_list_item.xml:使用するデータ・ソース(のFileDescriptor)を設定
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:background="@color/backgroundGray"
android:padding="0dp"
android:layout_height="115dp">
<ImageView
android:layout_height="match_parent"
android:id="@+id/folder_image"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:padding="0dp"
android:layout_width="115dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:padding="0dp"
android:layout_marginLeft="30dp">
<TextView
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:padding="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/folder_name"
android:layout_weight="50"
android:elevation="14dp"
android:textIsSelectable="false"
android:gravity="bottom"
android:paddingBottom="5dp"
android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textColor="@color/textBlack"/>
<TextView
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:paddingTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/amount_of_songs"
android:layout_weight="50"
android:textColor="@color/textGray"/>
</LinearLayout>
</LinearLayout>
ネストされたレイアウトはパフォーマンスに悪い(遅れを取るという驚異はありません!)。 RelativeLayoutsを使用する方が良いでしょう。また、画像はTextViewに** compound drawable **として含めることができるので、ImageViewは役に立ちません。 –
さて、私は相対レイアウトをしようとしています。私は複合型のドロアブルについて聞いたこともありませんでした。ありがとうございました! –
song_list_item.xmlを変更して、4つのTextViewを含むRelativeLayoutを使用するようにしましたが、遅れはまだ悪いです... –