Problem setting row backgrounds in Android Listview
- by zchtodd
I have an application in which I'd like one row at a time to have a certain color. This seems to work about 95% of the time, but sometimes instead of having just one row with this color, it will allow multiple rows to have the color.  Specifically, a row is set to have the "special" color when it is tapped.  In rare instances, the last row tapped will retain the color despite a call to setBackgroundColor attempting to make it otherwise.
private OnItemClickListener mDirectoryListener = new OnItemClickListener(){
    public void onItemClick(AdapterView parent, View view, int pos, long id){
        if (stdir.getStationCount() == pos) {
            stdir.moreStations();  
            return;
        }
        if (playingView != null)
            playingView.setBackgroundColor(Color.DKGRAY);
        view.setBackgroundColor(Color.MAGENTA);
        playingView = view;
        playStation(pos);
    }
};
I have confirmed with print statements that the code setting the row to gray is always called.  
Can anyone imagine a reason why this code might intermittently fail?  If there is a pattern or condition that causes it, I can't tell.
I thought it might have something to do with the activity lifecycle setting the "playingView" variable back to null, but I can't reliably reproduce the problem by switching activities or locking the phone.
private class DirectoryAdapter extends ArrayAdapter {
    private ArrayList<Station> items;
    public DirectoryAdapter(Context c, int resLayoutId, ArrayList<Station> stations){
        super(c, resLayoutId, stations);            
        this.items = stations;
    }
    public int getCount(){
        return items.size() + 1;
    }
    public View getView(int position, View convertView, ViewGroup parent){
        View v = convertView;
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (position == this.items.size()) {
            v = vi.inflate(R.layout.morerow, null);
            return v;
        }
        Station station = this.items.get(position);
        v = vi.inflate(R.layout.songrow, null);
        if (station.playing)
            v.setBackgroundColor(Color.MAGENTA);
        else if (station.visited)
            v.setBackgroundColor(Color.DKGRAY);
        else
            v.setBackgroundColor(Color.BLACK);
        TextView title  = (TextView)v.findViewById(R.id.title);
        title.setText(station.name);
        return v;
    }    
};