ListView-Adapter funzt nicht richtig -> warum?

H

Hagebutt

Neues Mitglied
0
Hi Forum,

ich versuche gerade ein kleines Problem mit meiner Listview zu lösen.

Meine ListView soll in jeder geraden Zeile einen String und in jeder ungeraden Zeile eine RadioGroup enthalten. Soweit klappt das eigendlich ganz gut, zumindest solange bis man scrollt. :bored:

Sobald man die Liste hoch oder runter fährt, werden plötzlich plätze getauscht, oder ich habe plötzlich zwei RadioGroup
untereinander etc...

Schuld müsste nach meiner Rechnung der Adapter sein, aber ich verstehe nicht warum :-(



Mein Code:

Code:
public class RadiogroupAdapter extends ArrayAdapter<Object>{
  
    RadioGroup mRadioGroup;
    TextView re;
    Context context;
    String TAG = "RGA";

      private ArrayList<Object> items;

      public RadiogroupAdapter(Context context, int textViewResourceId, ArrayList<Object> items) {
              super(context, textViewResourceId, items);
              this.context = context;
              this.items = items;
      }
      
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
              View v = convertView;
              ViewHolder holder;

              if (v == null || v.getTag()==null) {
                  LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  v = vi.inflate(R.layout.list_items, null);
                  holder = new ViewHolder();

              Object o = items.get(position);
              
              if (o != null) {
                  if(o instanceof String){
                      re=((TextView)v.findViewById(R.id.listtv));
                      re.setText((CharSequence) o);
                      re.setPadding(10, 10, 10, 10);
                      holder.re=re;
                  }
                  else if(o instanceof String[]){
                      mRadioGroup = (RadioGroup)v.findViewById(R.id.radiobuttons);
                      mRadioGroup.setPadding(15, 10, 15, 10);
                      createRadioButtons((String[]) o);
                      holder.mRadioGroup=mRadioGroup;
                  }
                  
              }
              v.setTag(holder);
              }
              else{
                  holder = (ViewHolder)v.getTag();
                  if(holder.re==null){
                      mRadioGroup= holder.mRadioGroup;
                      Log.d(TAG, "RG");
                  }
                  else{
                      re=holder.re;
                      Log.d(TAG,"RE");
                  }
              }
              return v;
              
      }
      
      private void createRadioButtons(String[] rating)    {

          LinearLayout.LayoutParams lp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT);
          lp.setMargins(10, 10, 10, 10);
          
                for (int j = rating.length-1; j >= 0; j--) {
                    RadioButton rb = new RadioButton(context);
                    rb.setTextColor(Color.BLACK);
                    rb.setTextSize(25.0f);
                    rb.setText(rating[j]);
                    rb.setOnClickListener(new OnClickListener() {
                        
                        @Override
                        public void onClick(View v) {
                            RadioButton bb = (RadioButton)v;
                            bb.setSelected(true);
                        }
                    });
                    
                    mRadioGroup.addView(rb,0,lp);
                }
      }

Der ViewHolder:

Code:
import android.widget.RadioGroup;
import android.widget.TextView;

public class ViewHolder {

    RadioGroup mRadioGroup = null;
    TextView re = null; 
}

WAs verstehe ich an der Adaptergeschichte falsch? :blink:

Danke im voraus!

Grüße
 
Wo ist denn die schließende Klammer des ersten If-Statements?
Wo setzt du denn die Sachen auf unsichtbar wenn kein convertView angegeben ist?
 
  • Danke
Reaktionen: Hagebutt
Wo ist denn die schließende Klammer des ersten If-Statements?

Die schließt sich gleich nachdem ich den holder der view als tag übergeben habe.

Wo setzt du denn die Sachen auf unsichtbar wenn kein convertView angegeben ist?

:blushing: Äh habe ich nicht immer eine convertview wenn meine Liste befüllt ist?
 
Natürlich hast du den dann, aber wenn doch ein View mit RadioGroup befüllt ist, die aber etwas anderes haben möchtest, wo wird die RadioGroup ausgeblendet?
Als convertView bekommst du ja einen schon befüllten View übergeben den du entsprechend ändern musst.
 
  • Danke
Reaktionen: Hagebutt
Das Problem ist, dass die alten convertviews unverändert durch getView() durchrasseln. Wenn da gerade eine RadioGroup zum recyclen als convertview ankommt das letzte erstellte Element aber auch eine RadioGroup war dann hast du in deiner Liste zwei RadioGroups unter einander.
 
  • Danke
Reaktionen: Hagebutt

Ähnliche Themen

A
Antworten
10
Aufrufe
1.021
swa00
swa00
S
Antworten
3
Aufrufe
637
swa00
swa00
S
Antworten
7
Aufrufe
1.161
swa00
swa00
Zurück
Oben Unten