2016-10-14 2 views
0

私はmp3プレーヤーアプリを作っています。Androidを操作する画面外リストビュー項目がnullポインタ例外を投げる

現在再生中の曲を強調表示するために、現在の曲のリスト項目の背景色を変更します。

onItemClickListenerを使用して実際のリスト項目をクリックすると、すべてうまく動作します。また、現在の曲が終了した後、次の曲をハイライト表示するように自動更新することもできます。

ただし、次の曲リスト項目が画面上にあるときのみ。私が最初の曲の上にいて、リストの最後の曲に戻るために戻ると同じことが起こります。曲は正常に再生されますが、バックグラウンドカラーを設定しようとすると、リストアイテムにnullポインタ例外が発生します。

更新色方法:?(私は最後の行にnullポインタ#1 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")); 
} 
たぶん

それが膨張されていないため、まだ、私は実際に知らないを取得

を私は膨らませるにはどうすればよいです。または「負荷」私は動的の色を変更したいビュー、私が試してみました

:?

.setSelection() 

バックグラウンドカラーを変更する前に、違いはありませんでした。移動してから、ロードされてnullにはならないと思いました。

この質問は、画面の外にあるビューを「プリロード」してパラメータ(背景色)を変更する方法を知りたいので、他の類似のものとは異なります。

重要なのはここに私のアダプタクラスですが、ここで何が関係するのかわからないので、もっとコードスニペットをリクエストしてください。

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

私が行う場合、私は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(); 
} 

    ... 
+0

私を追加しました "答え" を参照してください(質問を読んで) – Danny

関連する問題