0

各行に ImageView を持つ ListView があります。

getView 関数の各行に画像をロードする customAdapter があります。

public View getView(int position, View convertView, ViewGroup parent) {

    View row = convertView;
    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.list_row, parent, false);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.listImage = (ImageView) row
                .findViewById(R.id.list_image);
        viewHolder.title = (TextView) row.findViewById(R.id.title);
        viewHolder.description = (TextView) row
                .findViewById(R.id.description);
        row.setTag(viewHolder);

    }


    ItemDescription des = getItemDescriptionFromFile(items.get(position)
            + "/description.txt");
    ViewHolder holder = (ViewHolder) row.getTag();
    holder.title.setText(des.title);
    holder.description.setText(des.description+(position)%5);

    holder.listImage.setImageBitmap(getBitmapFromAsset(items.get(position));
    return row;

}

private Bitmap getBitmapFromAsset(String strName) {

    InputStream istr = null;
    try {
        istr = assetManager.open(strName);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    return bitmap;
}

しかし、リストのスクロールがスムーズではないことに気付きました。

私は自分の問題をグーグルで検索しましたが、このリンクが解決策のようです: http://developer.android.com/training/improving-layouts/smooth-scrolling.html

ただし、このコードにはいくつかの問題があります。

new AsyncTask<ViewHolder, Void, Bitmap>() {
private ViewHolder v;

@Override
protected Bitmap doInBackground(ViewHolder... params) {
    v = params[0];
    return mFakeImageLoader.getImage();
}

@Override
protected void onPostExecute(Bitmap result) {
    super.onPostExecute(result);
    if (v.position == position) {
        // If this item hasn't been recycled already, hide the
        // progress and set and show the image
        v.progress.setVisibility(View.GONE);
        v.icon.setVisibility(View.VISIBLE);
        v.icon.setImageBitmap(result);
    }
}
}.execute(holder);

位置が最終ではないため、内部クラス AsyncTask 内の位置にアクセスできません。

位置にアクセスする方法はありますか?

リストをスムーズにスクロールするにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

0

すべての呼び出しでディスク I/O を実行するのではなく、アダプターを初期化してそこからアクセスする前に、アセットからすべての画像をメモリにロードすることをお勧めしますgetView()。これにより、大幅な改善が得られるはずです。

于 2013-10-08T09:30:10.380 に答える
0

静的オブジェクトを持つクラスを使用して、キャッシュとして機能させることができます。このようにして、クラス オブジェクトはメモリへの最初のロードでアセットをキャッシュし、次の呼び出しでキャッシュを使用して bimtap にアクセスする時間が短縮されます。Bitmaps.getBitmapFromAsset(context,strName)以下のクラスを実装すると、独自の の代わりに呼び出すだけで済みますgetBitmapFromAsset(strName)staticこの方法でアセットに使用されるメモリは、 HastTable オブジェクトを使用しているため、アプリケーションを終了するまで解放されないことに注意してください。

import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;


public class Bitmaps {

    private static final Hashtable<String, Bitmap> cache = new Hashtable<String, Bitmap>();

    public static Bitmap getBitmapFromAsset(Context c, String strName) {
        synchronized (cache) {
            if (!cache.containsKey(strName)) {
                InputStream istr = null;
                try {
                    istr = c.getAssets().open(strName);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Bitmap bitmap = BitmapFactory.decodeStream(istr);

                cache.put(strName, bitmap);
            }
            return cache.get(strName);
        }
    }

}
于 2013-10-08T09:38:03.897 に答える