1

私のアプリケーションには、リスト アダプターがあります。各行には、左側に imageView が含まれ、右側に 2 つの textView が含まれます。画像を取得するために、Universal-Image-Loaderライブラリを使用しています。

私の getView() メソッドはこれです:

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

        if (convertView == null) {
            convertView     = myInflater.inflate(R.layout.list_news_adapter, null);
            holder          = new ViewHolder();
            holder.ivIcon   = (ImageView) convertView.findViewById(R.id.list_news_icon);
            holder.tvTitle  = (TextView)  convertView.findViewById(R.id.list_news_title);
            holder.tvDate   = (TextView)  convertView.findViewById(R.id.list_news_date);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        holder.tvTitle.setText(video.getTitle().get(position));
        holder.tvDate.setText(localTime.get(position));

        // Load and display image
        String imageUrl = (video.getDefaultImage128x96().get(position));
        imageUrl = imageUrl.trim().replaceAll(" ", "%20");
        imageLoader.displayImage(imageUrl, holder.ivIcon, options);



        holder.ivIcon.buildDrawingCache();
        Bitmap image = holder.ivIcon.getDrawingCache();
        if(image != null) {
            image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
            holder.ivIcon.setImageBitmap(image);
            holder.ivIcon.destroyDrawingCache();
        }


        return convertView;
    }

次のコードでは、さまざまなスレッドでダウンロードされるライブラリへの URL のリストを提供しています。

// Load and display image
String imageUrl = (video.getDefaultImage128x96().get(position));
imageUrl = imageUrl.trim().replaceAll(" ", "%20");
imageLoader.displayImage(imageUrl, holder.ivIcon, options);

その後、次のコードで、imageView (ダウンロードされた) の現在のイメージを取得し、他の方法でこのイメージの上にレイヤーを追加するように依頼します。

holder.ivIcon.buildDrawingCache();
Bitmap image = holder.ivIcon.getDrawingCache();

if(image != null) {
        image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
        holder.ivIcon.setImageBitmap(image);
        holder.ivIcon.destroyDrawingCache();
}

putOverlay() メソッドは次のようになります。

public Bitmap putOverlay(Bitmap bmp, int width, int height) {
        Bitmap overLay = BitmapFactory.decodeResource(context.getResources(), R.drawable.video_overlay);

        Bitmap bmBackground = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
        Canvas canvas = new Canvas(bmBackground);
        Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
        canvas.drawBitmap(bmp, 0, 0, paint); 
        canvas.drawBitmap(overLay, width*3/8, height*3/8, paint);

        return bmBackground;
    }

機能部品でした。結果はなんと!Universal Image Loader ライブラリは、メイン イメージがダウンロード中である限り、定義済みのイメージを使用します。私のコードは、この 2 つのレイヤーをマージできます。 ここに画像の説明を入力

ただし、メイン画像がダウンロードされると、オーバーレイ画像がこの画像の上にあると予想されますが、前の画像が上書きされます。 ここに画像の説明を入力

しかし、画面をスクロールすると、追加した画像が表示されます (ほとんどの画像には追加された画像があり、一部には追加された画像がありません)。 ここに画像の説明を入力

提案/コメントをいただければ幸いです。

4

1 に答える 1

2

解決策は、私が考えていたよりも簡単でした。

最初にそれらを削除しました

holder.ivIcon.buildDrawingCache();
Bitmap image = holder.ivIcon.getDrawingCache();
if(image != null) {
    image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight());
    holder.ivIcon.setImageBitmap(image);
    holder.ivIcon.destroyDrawingCache();
}

およびputOverlay()リスト アダプターからメソッドを作成し、行 ( list_news_adapter) の XML ファイルで、別の imageView を追加し、そのソース属性をイメージに設定しました。

うわー、それはうまくいきます。

于 2012-06-14T10:10:10.067 に答える