0

I use even and odd rows to set backgrond to my listview rows. In my efficientAdapter I set the row background as follows:

public View getView(int position, View convertView, ViewGroup parent) {
        vi = convertView;

        if (convertView == null) {

            vi = inflater.inflate(R.layout.ecran_multiple_row, null);
            holder = new ViewHolder();

            holder.txIndex = (TextView) vi.findViewById(R.id.txIndex);
            holder.txSTitle = (TextView) vi.findViewById(R.id.txSTitle);
            holder.btOnOFF = (ImageView) vi.findViewById(R.id.btOnOFF);
            vi.setTag(holder);


        } else
            holder = (ViewHolder) vi.getTag();



        /*
         * CHANGE ROW COLOR 0 WHITE 1 GRAY
         */

        if ( position % 2 == 0) //0 even 1 odd..
              vi.setBackgroundResource(R.drawable.listview_selector_odd);

            else
                vi.setBackgroundResource(R.drawable.listview_selector_even);


        /*
         * ONE ITEM IN ARRAY
         */

        if (data.toArray().length==1){
            holder.btOnOFF.setBackgroundResource(R.drawable.air_radio_button_rouge);
        }else {

            holder.btOnOFF.setBackgroundResource(R.drawable.air_deezer_check);
        }

        return vi;
    }

and in my MainActivity.Class. I select an item using on itemclicklistener() as shown below:

**lvRMultiple.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {



                 imgview = (ImageView) view.findViewById(R.id.btOnOFF);
                 //And change its background here
                 imgview.setBackgroundResource(R.drawable.air_radio_button_rouge);


            }
        });**

When i clicked on an item btnOff image change successfully but when i scroll down it change to default background. Secondly when i click on one item after the other both becomes the new image but i want only the row clicked by the user to change to new image and the previous image are set to default.

Dimitri
  • 659
  • 3
  • 18
  • 46

2 Answers2

3

All row view of a ListView created by the getView() method of BaseAdpter class. When ever we scroll the ListView all, new viable row create by getView() using recycle. So getView() called again and again when new row is viable on scroll.

There are two solution of your question:-\

  • You can save the status of ListView

// Save ListView state Parcelable state = listView.onSaveInstanceState();

// Set new items
listView.setAdapter(adapter);

// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state)
  • And other solution is create RowView at runtime and add it on a Parent Layout by using addView() method.

LayoutInflater inflater = LayoutInflater.from(context);

// You should use the LinerLayout instead  of the listview, and parent Layout should be inside of the ScrollView
parentView = (LinerLayout)this.findViewById(R.id.parentView);

for(int i = 0; i<=numberOfRow;i++){
   LinearLayout rowView = (LinerLayout)inflater.inflate(R.layout.rowView);
   ImageView rowImageView = (ImageView)rowView.findViewById(R.id.rowImage);
   rowImageView.setOnClickListener(new View.onClickListListener(){
     @Override
      public void onClick(){
        rowImageView.setImageBitmap(onClickBitmapImage);      
 }

});
parentView.addView(rowView); 
}

Please check this answer Maintain/Save/Restore scroll position when returning to a ListView

More Reference http://developer.android.com/reference/android/widget/Adapter.html#getView(int,android.view.View, android.view.ViewGroup)

Community
  • 1
  • 1
  • The first solution is right solution, and second solution may take more time to create row. – Dwivedi Ji Jul 01 '13 at 17:18
  • 1
    where to set these lines for the first solution ? – Dimitri Jul 02 '13 at 09:34
  • It would be nice to be able to use the first solution above, but I don't understand where we should call `listView.onRestoreInstanceState(state)` etc. – LarsH Jul 29 '19 at 18:37
0

The item changes back to the default background because the view gets recycled. This is the same problems of checkboxes losing their checked state

Check out this answer too see how to handle it:

CheckBox gets unchecked on scroll in a custom listview

As for your second problem, I believe it's already answered here:

highlighting the selected item in the listview in android

Hope it helps

Community
  • 1
  • 1
Androiderson
  • 15,139
  • 5
  • 60
  • 71