java - 我在将类型化数组中的可绘制资源 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 仓库在这里
任何帮助表示赞赏
解决方案
您可以使用TypedArray
来访问存储integer-array
在strings.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);
...
}
我希望它有所帮助。如果您遇到更多困难,请告诉我?
推荐阅读
- java - 为什么我的代码在使用文本文件时打印空数组([])?
- ios - 在异步工作完成之前关闭返回数据
- react-native - 如何从另一个组件以编程方式在 React Native 中更改选项卡栏图标?
- mongodb - 从不同的容器连接到 mongo - 连接被拒绝
- java - 给定邻接规则和无序数组,返回符合规则的数组
- java - 在 Eclipse 中生成 JavaDocs 时出现“未找到模块”消息
- c++ - 失败,错误 87:参数不正确。如何判断哪个参数不正确?
- java - Runtime.getRuntime().exec(command) 不做任何事情
- vue.js - 如何在 if 条件下设置数据变量的值
- python - 将 Tensorflow Frozen Graph 转换为 UFF 以进行 TensorRT 推理