Problem setting row backgrounds in Android Listview

Posted by zchtodd on Stack Overflow See other posts from Stack Overflow or by zchtodd
Published on 2010-12-25T06:09:11Z Indexed on 2010/12/25 6:54 UTC
Read the original article Hit count: 254

Filed under:
|

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

© Stack Overflow or respective owner

Related posts about android

Related posts about listview