为什么setImageResource什么都不显示?

时间:2011-03-26 16:37:01

标签: android resources android-listview android-imageview

我想在ListView中显示一个图标,具体取决于数据库值。我按照this的答案进行操作。 但结果没有显示任何内容。以下是我在 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

UPD 即可。以下代码效果很好:

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

5 个答案:

答案 0 :(得分:4)

public void setImageResource (int resId):这会在UI线程上进行Bitmap读取和解码,这会导致延迟打嗝。如果这是一个问题,请考虑使用setImageDrawable(Drawable)或setImageBitmap(Bitmap)和BitmapFactory。

尝试使图片视图无效,或使用文档建议的其中一种替代方法。

答案 1 :(得分:2)

我在另一个问题上找到了解决方案。

  

基本上是setViewValue()方法   应该返回false,直到它被调用   为您的图像视图。那应该是   在视图中设置数据并返回   真正。返回值表示   ViewBinder是否设置视图   本身或适配器应该   通过默认绑定数据本身   行为。

由于我没有返回true,因此工作不正确。 现在它完美无缺。

答案 2 :(得分:1)

尝试#2。 你为什么不尝试这个......

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

我认为你可能正在创建一个新的ImageView而不是抓住你布局中已存在的那个。

答案 3 :(得分:1)

这段代码解决了这个问题:

ImageView movieIcon = (ImageView)findViewById(R.id.movie_subscribed_icon);
Drawable drawable = this.getResources().getDrawable(R.drawable.android);
movie_subscribed_icon.setBackgroundDrawable(drawable);

答案 4 :(得分:0)

这有效......

在XML中,不要对ImageView drawable使用“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()作为其弃用。

希望这也适用于其他人。