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();
 }

  ...