0

我有一个 ListView,每行都有一个 ImageView。

我有一个 customAdapter 为 getView 函数中的每一行加载图像。

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

我建议您在初始化适配器并从那里访问它之前将资产中的所有图像加载到内存中,而不是在每次getView()调用时执行磁盘 I/O。这应该会带来显着的改善。

于 2013-10-08T09:30:10.380 回答
0

您可以使用具有静态对象的类来充当缓存。这种方式类对象在第一次加载到内存中缓存资产,并且在下一次调用中使用缓存访问 bimtaps 的时间将减少。实现下面的类你只需要调用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 回答