Как обрабатывать ImageView внутри ListView?

У меня есть ListView внутри Activity, и каждый его элемент настроен так, чтобы иметь несколько TextViews, а также элемент DropDownList и ImageView. Внутри реализации OnScrollListener() каждый элемент listView заполняется с помощью ArrayAdapter, заполняющего текстовые представления значениями, взятыми из arrayList и ImageView с файлом .jpeg, хранящимся на SD-карте. . Ниже приведен скриншот элемента listView List View Item

Проблема возникает, когда файл .jpeg с SD-карты преобразуется в растровое изображение (например, BitmapFactory.decodeFile(fileName)), а затем назначается представлению изображения с помощью setImageBitmap(Bitmap bmp). Поскольку установка растрового изображения в представление изображения является длительным процессом, он не может идти в ногу с реализацией прослушивателя прокрутки, и ImageView различных строк ListView заполняется изображением, которое было назначено любой строке выше. Может ли кто-нибудь предложить какую-нибудь тренировку, чтобы решить эту проблему, в частности, назначение изображений с SD-карты на изображение. Это не похоже на то, что мой элемент 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);
    }
}

person Abdul Rehman    schedule 28.09.2012    source источник
comment
вам понадобится асинтаск для загрузки.   -  person njzk2    schedule 28.09.2012
comment
Я долго боролся с этой проблемой. Наконец мне удалось это сделать, синхронизировав метод (который возвращал растровое изображение).   -  person Yogesh Somani    schedule 28.09.2012
comment
Привет, njzk2. Я также проверил свою реализацию без onScrollListener, но результат тот же. Я отредактировал свой вопрос, добавив в него код реализации адаптера. Не могли бы вы просмотреть его, чтобы предложить проблему с ним   -  person Abdul Rehman    schedule 28.09.2012


Ответы (1)


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

Это будет для вас надеждой: P

person Arnold    schedule 28.09.2012
comment
Предложенный вами контент был довольно информативным, но не помог мне с проблемой. Даже после реализации асинхронного класса для преобразования изображения в растровое изображение результат onScrollListener вызывает ту же проблему, что и раньше. Изображение отображается в ImageView случайных строк. - person Abdul Rehman; 28.09.2012