0

Activity 内に ListView があり、その各項目は、 DropDownList項目とImageViewとともにいくつかのTextViewを持つようにカスタマイズされています。OnScrollListener()実装内では、 listView の各項目は、SD カードに保存された.jpegファイルを使用して arrayList および ImageView から取得した値をテキスト ビューに取り込む ArrayAdapter を使用して取り込まれます。以下は 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 に答える