0

我在 Activity 中有一个 ListView ,它的每个项目都被定制为有一些TextViews以及一个DropDownList项目和一个ImageView。在OnScrollListener()实现中,listView 的每个项目都使用 ArrayAdapter 填充文本视图,该文本视图的值取自 arrayList 和 ImageView 以及存储在 SD 卡上的.jpeg文件。以下是 listView Item 的 screenSHot 列表视图项目

当 sdCard 中的 .jpeg 文件转换为位图(即BitmapFactory.decodeFile(fileName))然后使用setImageBitmap(Bitmap bmp)分配给图像视图时,就会出现问题. 由于将位图图像设置为图像视图是一个漫长的过程,因此它无法跟上滚动侦听器实现的步伐,并且不同 ListView 行的 ImageView 会填充它分配给上面任何行的图像。任何人都可以建议一些锻炼来解决这个问题,特别是将图像从 SD 卡分配到 imageView。它不像我的 listView 项目过度加载控件,这就是我面临这个问题的原因。我也尝试过在每行内使用单个 ImageView 项目,它的行为方式相同。欢迎您提出即兴创作的建议,并且肯定会有很大帮助。谢谢 :-)

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

    View row = convertView;
    AssetDetailHolder assetDetailholder = null;

    try {

        if (row == null) {

            LayoutInflater inflator = ((Activity) context)
                    .getLayoutInflater();
            row = inflator.inflate(layoutResourceID, parent, false);

            assetDetailholder = new AssetDetailHolder();

            assetDetailholder.itemPosition = position;

            assetDetailholder.txtVwlineCOde = (TextView) row
                    .findViewById(R.id.lineCodeValue_ad);
            assetDetailholder.txtvwLocation = (TextView) row
                    .findViewById(R.id.locationValue_ad);
            assetDetailholder.txtvwLocationDetail = (TextView) row
                    .findViewById(R.id.detailLocationValue_ad);
            assetDetailholder.txtvwInventoryNo = (TextView) row
                    .findViewById(R.id.InventoryNoValue_ad);
            assetDetailholder.spnrconditionCode = (Spinner) row
                    .findViewById(R.id.spinner_ad);
            assetDetailholder.txtvwAssetName = (TextView) row
                    .findViewById(R.id.AssetNameValue_ad);
            assetDetailholder.subNoThumbnail = (ImageView) row
                    .findViewById(R.id.IV_subNoThumbnail);

            row.setTag(assetDetailholder);
        } else {
            assetDetailholder = (AssetDetailHolder) row.getTag();
            assetDetailholder.itemPosition = position;
        }

        AssetDetail assetDetail = assetsDetailList[position];

        new ThumbnailTask(position, assetDetailholder, assetDetail, context)
                .execute();

        if (assetDetail.assetLineCodeDesc.equals("")) {
            assetDetailholder.txtVwlineCOde
                    .setText(assetDetail.strLineCOde);
        } else {
            assetDetailholder.txtVwlineCOde.setText(assetDetail.strLineCOde
                    + "(" + assetDetail.assetLineCodeDesc + ")");
        }

        if (assetDetail.assetLocationNameDesc.equals("")) {
            assetDetailholder.txtvwLocation
                    .setText(assetDetail.strLocationName);
        } else {
            assetDetailholder.txtvwLocation
                    .setText(assetDetail.strLocationName + "("
                            + assetDetail.assetLocationNameDesc + ")");
        }

        assetDetailholder.txtvwLocationDetail
                .setText(assetDetail.strLocationDetail);

        if (assetDetail.strInventoryNumber.contains("-")) {
            assetDetailholder.txtvwInventoryNo
                    .setText(assetDetail.strInventoryNumber.split("-")[0]);
        } else {
            assetDetailholder.txtvwInventoryNo
                    .setText(assetDetail.strInventoryNumber);
        }
        assetDetailholder.txtvwAssetName.setText(assetDetail.assetName);

        String conditionCodeString = assetDetail.assetConditionCode;

        if (conditionCodeString != "" || conditionCodeString != null) {
            try {
                int conditionCodeInteger = Integer
                        .parseInt(conditionCodeString);
                assetDetailholder.spnrconditionCode
                        .setSelection(conditionCodeInteger);
            } catch (Exception e) {
                assetDetailholder.spnrconditionCode.setSelection(0);
            }
        } else {
            assetDetailholder.spnrconditionCode.setSelection(0);
        }

        // String thumbnailDir = Common
        // .getSubNoDirectory(context, assetDetail);

        // if (new File(thumbnailDir).isDirectory()) {
        //
        // File thumbnailFile = new File(Common.getSubNoImgFilePath(
        // thumbnailDir, assetDetail, SubNo_ImageSample.A));
        //
        // if (thumbnailFile.exists()) {
        // assetDetailholder.subNoThumbnail
        // .setImageBitmap(BitmapFactory
        // .decodeFile(thumbnailFile.getAbsolutePath()));
        // }
        // }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return row;
}

static class AssetDetailHolder {
    TextView txtVwlineCOde;
    TextView txtvwLocation;
    TextView txtvwLocationDetail;
    TextView txtvwInventoryNo;
    TextView txtvwAssetName;
    Spinner spnrconditionCode;
    ImageView subNoThumbnail;
    public int itemPosition;
}

private static class ThumbnailTask extends AsyncTask<Void, Void, Void> {

    private int mPosition;
    private AssetDetailHolder mHolder;
    private Context cntxt;
    private AssetDetail assetItem;

    private Bitmap thumbnailBmp;

    public ThumbnailTask(int position, AssetDetailHolder holder,
            AssetDetail asset, Context context) {
        mPosition = position;
        mHolder = holder;
        assetItem = asset;
        cntxt = context;
    }

    @Override
    protected Void doInBackground(Void... params) {

        String thumbnailDir = Common.getSubNoDirectory(cntxt, assetItem);

        if (new File(thumbnailDir).isDirectory()) {

            File thumbnailFile = new File(Common.getSubNoImgFilePath(
                    thumbnailDir, assetItem, SubNo_ImageSample.A));

            if (thumbnailFile.exists()) {

                thumbnailBmp = BitmapFactory.decodeFile(thumbnailFile
                        .getAbsolutePath());
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (mHolder.itemPosition == mPosition && thumbnailBmp != null) {
            mHolder.subNoThumbnail.setImageBitmap(thumbnailBmp);
        }
        // super.onPostExecute(result);
    }
}
4

1 回答 1

1

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

这对你很有希望:P

于 2012-09-28T08:13:54.677 回答