我正在制作一款MP3播放器应用。
为了更好地突出显示正在播放的歌曲,我更改了当前歌曲列表项目的背景颜色。
当我使用onItemClickListener单击实际列表项时,一切正常。我也可以自动更新以在当前歌曲结束后突出显示下一首歌曲。
但是仅当下一首歌曲列表项目在屏幕上时。如果我在第一首歌并按回去列表中的最后一首歌,也是如此。这首歌很好,但是当我尝试设置背景颜色时,我在列表项上得到一个空指针异常。
更新颜色方法:(我在最后一行获得nullpointer#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"));
}
也许是因为它还没有膨胀?我其实不知道。
我如何充气或'#34;加载"我希望动态改变颜色的视图吗?
我试过了:
.setSelection()
在更改背景颜色之前,但没有任何区别,我想,因为我移动它,它将被加载"因此不会为空。
这个问题与其他类似的问题不同,因为我想知道我怎么能预先加载"一个在屏幕外的视图并改变它的参数(背景颜色)。
如果重要的话,这是我的适配器类,并随时请求更多代码片段,因为我不知道这里可能有什么相关的内容。
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;
}
}
谢谢!
答案 0 :(得分:1)
如果我这样做,我会在PlayListAdpater中更新视图 我正在为适配器中的选定位置添加变量 而且我在下一首歌曲播放时会改变它。
如果在服务中调用'updateSongColor',则可以使用广播或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();
}
...