5

データベースの値に応じて ListView にアイコンを表示したいと思います。私はそうするためにこの答えに従います。しかし、結果として何も表示されません。これが私のrow.xmlにあるものです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

    <ImageView
        android:id="@+id/movie_subscribed_icon"
        android:padding="3dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/star_off"/>

    <LinearLayout 
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical">

     <TextView android:id="@+id/movie_name"
     ...

コードは次のとおりです。

    movies.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
          int viewId = view.getId();
          switch(viewId) {
          case R.id.movie_name:
                  int readValue = cursor.getInt(cursor.getColumnIndexOrThrow(MoviesDbAdapter.KEY_READ));
                  if (readValue == 1) { // viewed movie item
                      TextView movieName = (TextView) view;
                      movieName.setTextColor(Color.GRAY);
                  }
                  break;
          case R.id.movie_subscribed_icon:
              int subscribedValue = cursor.getInt(cursor.getColumnIndexOrThrow(MoviesDbAdapter.KEY_READ));
                  if (subscribedValue > 0) { // subscribed movie item
                      ImageView movieIcon = (ImageView) view;
                      movieIcon.setImageResource(R.drawable.star_off);
                  }
              break;
          }
          return false;
        }

      } );

特に、私のコードではデフォルトのアイコンと同じアイコンを使用しています。ここで何が問題なのですか?(私はstar_offdrawable-hdpiフォルダーdrawable-mdpiのみを持っています)

更新。次のコードはうまく機能します。

movieIcon.setImageDrawable(getResources().getDrawable(R.drawable.star_off));
4

5 に答える 5

5

public void setImageResource (int resId) : これは、UI スレッドでビットマップの読み取りとデコードを行うため、遅延の問題が発生する可能性があります。それが懸念される場合は、代わりに setImageDrawable(Drawable) または setImageBitmap(Bitmap) と BitmapFactory の使用を検討してください。

画像ビューを無効にするか、ドキュメントで提案されている代替手段のいずれかを使用してください。

于 2011-03-26T17:07:35.000 に答える
2

別の質問で解決策を見つけました。

基本的に、setViewValue()メソッドは、画像ビューに対して呼び出されるまでfalseを返す必要があります。次に、ビューにデータを設定し、trueを返す必要があります。戻り値は、ViewBinderがビュー自体を設定するかどうか、またはアダプターがデフォルトの動作を介してデータ自体をバインドする必要があるかどうかを示します。

trueを返さなかったため、正しく機能しませんでした。今では完全に機能します。

于 2011-03-28T19:51:58.413 に答える
1

このコードは問題を解決します:

ImageView movieIcon = (ImageView)findViewById(R.id.movie_subscribed_icon);
Drawable drawable = this.getResources().getDrawable(R.drawable.android);
movie_subscribed_icon.setBackgroundDrawable(drawable);
于 2011-05-17T00:39:29.070 に答える
1

試み #2。これを試してみませんか...

ImageView movieIcon = (ImageView)findViewById(R.id.movie_subscribed_icon);
movieIcon.setImageResource(R.drawable.star_off);

レイアウトに既に存在するものを取得する代わりに、新しい ImageView を作成している可能性があると思います。

于 2011-03-26T21:13:35.663 に答える
-1

これは機能します...

XML では、ImageView ドローアブルに「src」属性を使用しないでください。代わりに、「背景」を使用してください。

このような:

<ImageView
        android:id="@+id/maximize_inbox_window"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_action_original_image"
        android:layout_gravity="center_vertical"
        android:clickable="true"
        android:paddingRight="5dp" />

そして、実行時に画像を変更するJavaコードはここにあります...

ImageView img = (ImageView) rootView.findViewById(R.id.image_view_name);
img.setBackground(getResources().getDrawable(R.drawable.resource_id));
img.invalidate();

image_view_name を XML 内の ImageView に置き換え、resource_id をドローアブル フォルダー内の画像の名前に置き換えます。invalidate() を呼び出すことを忘れないでください。

注: 非推奨の setBackgroundDrawable() は使用しないでください。

これが他の人にも役立つことを願っています。

于 2014-08-04T10:16:38.387 に答える