Android 在屏幕外操作 Listview 项目抛出空指针异常
Android manipulating Listview items outside screen throws nullpointer exception
我正在制作一个 mp3 播放器应用程序。
为了更好的突出显示正在播放的歌曲,我更改了当前歌曲列表项的背景颜色。
当我使用 onItemClickListener 单击实际列表项时一切正常。我还可以在当前歌曲结束后自动更新以突出显示下一首歌曲。
但是只有当下一首歌曲列表项出现在屏幕上时。如果我在播放第一首歌曲并按返回键转到列表中的最后一首歌曲,情况也是如此。歌曲播放正常,但当我尝试设置背景颜色时,列表项出现空指针异常。
更新颜色方法:(我在最后一行得到空指针#ff9966
public static void updateSongColor() {
if (currentSongPos == songs.size()-1) {
currentSongPos = 0;
}
else {
currentSongPos++;
}
currentSongView.setBackgroundColor(Color.parseColor("#FFFFFF"));
currentSongView = listView.getChildAt(currentSongPos);
currentSongView.setBackgroundColor(Color.parseColor("#ff9966"));
}
可能是因为它还没有充气?其实我也不知道
如何膨胀或"load"我想动态改变颜色的视图?
我试过:
.setSelection()
在更改背景颜色之前,但没有任何区别,我认为既然我移动到它,它将是 "loaded",因此不为空。
这个问题与其他类似问题不同,因为我想知道如何 "Pre-load" 屏幕外的视图并更改其参数(背景颜色)。
这是我的适配器 class 如果它很重要,请随时请求更多代码片段,因为我不知道这里可能有什么相关的。
public class PlayListAdapter extends ArrayAdapter<Song> {
public PlayListAdapter(Context context, ArrayList<Song> objects) {
super(context, 0, objects);
}
@Override
public View getView(int position, View row, ViewGroup parent) {
Song data = getItem(position);
row = getLayoutInflater().inflate(R.layout.layout_row, parent, false);
TextView name = (TextView) row.findViewById(R.id.label);
name.setText(String.valueOf(data));
row.setTag(data);
return row;
}
}
谢谢!
如果我这样做,我会更新 PlayListAdpater 中的视图。
我正在为适配器中的选定位置添加变量。
我会在播放下一首歌曲时更改它。
如果在Service中调用'updateSongColor',可以使用broadcast或者AIDL。
示例)
public class PlayListAdapter extends ArrayAdapter<Song> {
private int currentSongPos =-1; // init
...
public void setCurrentSong(int pos) {
currentSongPos = pos;
}
...
@Override
public View getView(int position, View row, ViewGroup parent) {
....
if(currentSongPos == position)
currentSongView.setBackgroundColor(Color.parseColor("#ff9966"));
else
currentSongView.setBackgroundColor(Color.parseColor("#FFFFFF"));
....
}
}
....
....
// call updateSongColor
public void updateSongColor() {
if (currentSongPos == songs.size()-1) {
currentSongPos = 0;
}
else {
currentSongPos++;
}
PlayListAdapter.setCurrentSong(currentSongPos);
PlayListAdapter.notifyDataSetChanged();
}
...
我正在制作一个 mp3 播放器应用程序。
为了更好的突出显示正在播放的歌曲,我更改了当前歌曲列表项的背景颜色。
当我使用 onItemClickListener 单击实际列表项时一切正常。我还可以在当前歌曲结束后自动更新以突出显示下一首歌曲。
但是只有当下一首歌曲列表项出现在屏幕上时。如果我在播放第一首歌曲并按返回键转到列表中的最后一首歌曲,情况也是如此。歌曲播放正常,但当我尝试设置背景颜色时,列表项出现空指针异常。
更新颜色方法:(我在最后一行得到空指针#ff9966
public static void updateSongColor() {
if (currentSongPos == songs.size()-1) {
currentSongPos = 0;
}
else {
currentSongPos++;
}
currentSongView.setBackgroundColor(Color.parseColor("#FFFFFF"));
currentSongView = listView.getChildAt(currentSongPos);
currentSongView.setBackgroundColor(Color.parseColor("#ff9966"));
}
可能是因为它还没有充气?其实我也不知道
如何膨胀或"load"我想动态改变颜色的视图?
我试过:
.setSelection()
在更改背景颜色之前,但没有任何区别,我认为既然我移动到它,它将是 "loaded",因此不为空。
这个问题与其他类似问题不同,因为我想知道如何 "Pre-load" 屏幕外的视图并更改其参数(背景颜色)。
这是我的适配器 class 如果它很重要,请随时请求更多代码片段,因为我不知道这里可能有什么相关的。
public class PlayListAdapter extends ArrayAdapter<Song> {
public PlayListAdapter(Context context, ArrayList<Song> objects) {
super(context, 0, objects);
}
@Override
public View getView(int position, View row, ViewGroup parent) {
Song data = getItem(position);
row = getLayoutInflater().inflate(R.layout.layout_row, parent, false);
TextView name = (TextView) row.findViewById(R.id.label);
name.setText(String.valueOf(data));
row.setTag(data);
return row;
}
}
谢谢!
如果我这样做,我会更新 PlayListAdpater 中的视图。
我正在为适配器中的选定位置添加变量。
我会在播放下一首歌曲时更改它。
如果在Service中调用'updateSongColor',可以使用broadcast或者AIDL。
示例)
public class PlayListAdapter extends ArrayAdapter<Song> {
private int currentSongPos =-1; // init
...
public void setCurrentSong(int pos) {
currentSongPos = pos;
}
...
@Override
public View getView(int position, View row, ViewGroup parent) {
....
if(currentSongPos == position)
currentSongView.setBackgroundColor(Color.parseColor("#ff9966"));
else
currentSongView.setBackgroundColor(Color.parseColor("#FFFFFF"));
....
}
}
....
....
// call updateSongColor
public void updateSongColor() {
if (currentSongPos == songs.size()-1) {
currentSongPos = 0;
}
else {
currentSongPos++;
}
PlayListAdapter.setCurrentSong(currentSongPos);
PlayListAdapter.notifyDataSetChanged();
}
...