Android操作屏幕外的Listview项会抛出nullpointer异常

时间:2016-10-14 01:09:23

标签: android listview nullpointerexception listviewitem

我正在制作一款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;
    }
}

谢谢!

1 个答案:

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

  ...