首页 > 解决方案 > 我在将类型化数组中的可绘制资源 ID 添加到自定义 ArrayAdapter 时遇到问题。他们都以“0”的形式出现

问题描述

我对 Java 编程比较陌生,我正在从事 Android Basics Nanodegree 计划 (Udacity) 的作业。我正在构建一个自定义类(Song)并使用 anArrayAdapter和 a填充布局RecyclerView。我已经导入ButterKnife用于绑定数据。

数组的数据已被硬编码到strings.xml. 歌曲的每个属性都有一个类型化数组——歌曲名称、专辑名称、艺术家姓名、歌曲长度和封面艺术。除了封面艺术是一个 int(可绘制资源 ID)之外,其他都是字符串。当我运行应用程序时,所有数据点都填充到布局 ( RecyclerView) 中,但封面除外。

我已经尝试了多次定义类型化数组的迭代,但是每次运行应用程序时带入数组的值对于每个封面艺术都是“0”。我已经尝试将类型化数组编码为<array name="songsCoverArt"> ...</array>并且也尝试过<integer-array name="songsCoverArt">...</integer-array>. 每次都是一样的结果。

该数组填充在MainActivity.java中。

ArrayList<Song> songs = new ArrayList<>();
    String[] songTitle = getResources().getStringArray(R.array.songsTitles);
    String[] albumTitle = getResources().getStringArray(R.array.albumTitle);
    String[] songLength = getResources().getStringArray(R.array.songsLength);
    String[] artistName = getResources().getStringArray(R.array.artistName);
    int[] songCoverArt = getResources().getIntArray(R.array.songsCoverArt);

    for (int i = 0; i < songTitle.length; i++) {
        // debug logging
        Log.d(TAG, "Adding = " + songTitle[i] + " " + albumTitle[i] + " " + songLength[i] + " " + artistName[i] + " " + songCoverArt[i]);
        songs.add(new Song(songTitle[i], albumTitle[i], songLength[i], artistName[i], songCoverArt[i]));
     }
     songAdapter.addItems(songs);
     recyclerView.setAdapter(songAdapter);

strings.xml中封面艺术的类型化数组,如下所示:

<array name="songsCoverArt">
   <item>@drawable/coverart_indigo_big</item>
   ...
</array>

我也尝试过像这样定义 Drawables,这给了我完全相同的结果:

<array name="songsCoverArt">
   <item>R.drawable.coverart_indigo_big</item>
   ...
</array>

ImageView 填充在SongAdapter.java中:

@BindView(R.id.songTitle) TextView songTitle;
@BindView(R.id.songLength) TextView songLength;
@BindView(R.id.artistName) TextView artistName;
@BindView(R.id.albumTitle) TextView albumTitle;
@BindView(R.id.coverArt) ImageView coverArt;

public ViewHolder(View itemView) {
   super(itemView);
   ButterKnife.bind(this, itemView);
}

protected void clear() {
   songTitle.setText("");
   albumTitle.setText("");
   songLength.setText("");
   artistName.setText("");
   coverArt.setImageDrawable(null);
}

public void onBind(int position) {
    super.onBind(position);

    final Song song = SongList.get(position);

    if (song.getSongTitle() != null) {
         songTitle.setText(song.getSongTitle());
    }

    if (song.getAlbumTitle() != null) {
         albumTitle.setText(song.getAlbumTitle());
    }
    if (song.getSongLength() != null) {
         songLength.setText(song.getSongLength());
    }

    if (song.getArtistName() != null) {
         artistName.setText(song.getArtistName());
    }

     if (song.getCoverArt() != 0) {
         coverArt.setImageResource(song.getCoverArt());
     }

这是应用程序运行时的日志输出。日志中没有错误。请注意调试输出末尾的“0”。那应该是封面艺术drawables的ID。

D/SongAdapter: Adding = Be There Jumper 3.4 Halton 0
D/SongAdapter: Adding = Indigo Jumper 4.40 Halton 0
D/SongAdapter: Adding = Kiss Me The Course 4.10 Radson 0
D/SongAdapter: Adding = Halfs Operatic 4.10 Jonesie 0
D/SongAdapter: Adding = Create Poisonous 3.90 Two People 0
D/SongAdapter: Adding = Bigger Proper Attire 4.12 Rotten 0
D/SongAdapter: Adding = Rave On Harlem 3.85 Trapper 0
D/SongAdapter: Adding = Yank Harley 3.90 Korix 0
D/SongAdapter: Adding = Line Up Harlem 3.95 Pepper Sky 0
D/SongAdapter: Adding = Please Cracked 4.05 Yellow 0
D/SongAdapter: Adding = Hurry Cracked 4.20 Yellow 0
D/SongAdapter: Adding = Proud Farsity 4.25 Cannon 0

完整的 github 仓库在这里

任何帮助表示赞赏

标签: javaandroidbutterknife

解决方案


您可以使用TypedArray来访问存储integer-arraystrings.xml. 我已经克隆了您的存储库并进行了以下调整以解决您的问题。我还提出了一个拉取请求,您可以合并它。这是我的修改,

字符串.xml

<resources>

...

<integer-array name="songsCoverArt">
    <item>@drawable/coverart_indigo_big</item>
    <item>@drawable/coverart_indigo_big</item>
    <item>@drawable/coverart_kissme_big</item>
    <item>@drawable/coverart_halfs_big</item>
    <item>@drawable/coverart_create_big</item>
    <item>@drawable/coverart_bigger_big</item>
    <item>@drawable/coverart_raveon_big</item>
    <item>@drawable/coverart_yank_big</item>
    <item>@drawable/coverart_lineup_big</item>
    <item>@drawable/coverart_hurry_big</item>
    <item>@drawable/coverart_hurry_big</item>
    <item>@drawable/coverart_proud_big</item>
</integer-array>

...

</resources>

MainActivity.java

...

private void prepareDefaultContent() {
        ArrayList<Song> songs = new ArrayList<>();
        //Resources r = recyclerView.getContext().getResources();

        String[] songTitle = getResources().getStringArray(R.array.songsTitles);
        String[] albumTitle = getResources().getStringArray(R.array.albumTitle);
        String[] songLength = getResources().getStringArray(R.array.songsLength);
        String[] artistName = getResources().getStringArray(R.array.artistName);

        TypedArray typedArray = getResources().obtainTypedArray(R.array.songsCoverArt);

        for (int i = 0; i < songTitle.length; i++) {

            int coverArtResourceId = typedArray.getResourceId(i, 0);

            Log.d(TAG, "Adding = " + songTitle[i] + " " + albumTitle[i] + " " + songLength[i] + " " + artistName[i] + " " + coverArtResourceId);

            songs.add(new Song(songTitle[i], albumTitle[i], songLength[i], artistName[i], coverArtResourceId));

        }

        typedArray.recycle(); // Important

        songAdapter.addItems(songs);
        recyclerView.setAdapter(songAdapter);

    }
...

SongDetail.java

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.song_detail);

    ...

    int BigCoverArt = intent.getIntExtra("coverArt", 0);

    ...
}

我希望它有所帮助。如果您遇到更多困难,请告诉我?


推荐阅读