0

そこで、GridView に似たカスタム ビューを作成しました。画像がアプリ内のリソースである場合、画像を正常に読み込んでスクロールしますが、HTTP 要求を介して受信する画像を使用しているため、画像が正しく読み込まれません。

アプリの起動時: すべての画像がデフォルトに設定されています (悪い)

そのセルを過ぎてスクロールし、すぐにスクロールして戻った後: 画像が正しく読み込まれます (良い)

しばらくして同じセルにスクロールして戻った後: 画像がデフォルトに戻されました (悪い)

このエラーの原因について考えている人はいますか? ある種のリサイクルの問題だと思いますが、修正できませんでした。

ここに私のxmlファイルがあります:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:paddingBottom="1dip" 
    android:background="@color/white"
    android:id="@+id/highlight_counter_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:gravity="center" >

    <ImageView
        android:id="@+id/catalog_image"
        android:layout_width="match_parent"

        android:layout_height="match_parent"/>

    <View
        android:id="@+id/solid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/black" />

    <View
        android:id="@+id/text_gradient"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/solid"
        android:background="@drawable/highlight_text_gradient" />

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:padding="@dimen/highlight_text_padding"
            android:ellipsize="end"
            android:gravity="bottom"
            android:maxLines="2"
            android:textColor="@color/white"
            android:textSize="@dimen/text_large" />
</RelativeLayout>

これは私のアダプターからの抜粋です(おそらく問題があると思います):

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    final LayoutParams lp;
    int viewType = getItemViewType(position);
    ImageView img;
    PulseTextView title;
    Resources res = getContext().getResources();
    int height = (int) res.getDimension(R.dimen.icon_main_size);
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.element_item, parent, false)

        LayoutParams layp = new LayoutParams(height);
        convertView.setLayoutParams(layp);
    } 
    img = ViewHolder.get(convertView,R.id.catalog_image);
    title = ViewHolder.get(convertView,R.id.title);


    final CatalogItem channel = getCatalogItem(position);

    // find the url of the associated image then set image
    String url = null;
    try {
        url = mCatalogHandler.getImageUrl(CatalogHandler.VALUE_ICON, channel.mPrimaryKey, 100, 100);
    } catch (CatalogException e) {
        e.printStackTrace();
    }
    if (url == null || TextUtils.isEmpty(url) || url.equals("null")) {
        img.setImageBitmap(mDefaultPic);
    } else {
        // downloads the image to img
        mImageDownloader.download(url, img, mDefaultPic, false);
    }
    title.setText(channel.mDomain);
    img.setScaleType(ScaleType.FIT_XY);
    img.setTag(RAMImageCache.KEY_URL, url);

    // set the gradient behind the text
    View grad = convertView.findViewById(R.id.text_gradient);
    ViewUtils.setHeight(grad, height * 3 / 5);
    grad.getBackground().setDither(true);
    View solid = convertView.findViewById(R.id.solid);
    ViewUtils.setHeight(solid, height / 5);

    // set the padding based on the position on the screen
    DisplayMetrics displaymetrics = new DisplayMetrics();
    ((Activity)getContext()).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int width = displaymetrics.widthPixels;
    if (convertView.getRight() == width && convertView.getLeft() == 0) {
        convertView.setPadding(0, 0, 0, 1);
    } else if (convertView.getRight() == width) {
        //convertView.setPadding(1, 0, 0, 1);
        convertView.setPadding(0, 0, 1, 1);
    } else if (convertView.getLeft() == 0) {
        //convertView.setPadding(0, 0, 1, 1);
        convertView.setPadding(1, 0, 0, 1);
    }

    // set the onclicklistener to jump to the next fragment
    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putString("channelitem", channel.getMetadata().toString());
            ChannelFragment fragment = new ChannelFragment();
            fragment.setArguments(bundle);
            ((PulseFragmentActivity)mContext.get()).openFragment(fragment);
        }
});
    return convertView;
}

static class ViewHolder {
    ImageView img;
    TextView title;

    public ViewHolder(ImageView i, PulseTextView t) {
        img = i;
        title = t;
    }

    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            view.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }
}

正しい方向のポイントは非常に役立ちます! 他に必要なコード スニペットがあれば教えてください。

4

2 に答える 2

0

デバッグする方法の 1 つは、別のイメージ ダウンロード ライブラリを試して、コードにエラーがあるかどうかを確認することです。https://github.com/koush/UrlImageViewHelperを使用しましたが、セルを再利用するとうまく機能し、その API は現在使用しているものと似ています

于 2013-06-10T02:12:38.650 に答える