1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. Hagebutt, 17.01.2012 #1
    Hagebutt

    Hagebutt Threadstarter Neuer Benutzer

    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
     
  2. the_alien, 17.01.2012 #2
    the_alien

    the_alien Android-Lexikon

    Wo ist denn die schließende Klammer des ersten If-Statements?
    Wo setzt du denn die Sachen auf unsichtbar wenn kein convertView angegeben ist?
     
    Hagebutt gefällt das.
  3. Hagebutt, 17.01.2012 #3
    Hagebutt

    Hagebutt Threadstarter Neuer Benutzer

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

    :blushing: Äh habe ich nicht immer eine convertview wenn meine Liste befüllt ist?
     
  4. the_alien, 17.01.2012 #4
    the_alien

    the_alien Android-Lexikon

    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.
     
    Hagebutt gefällt das.
  5. strider, 17.01.2012 #5
    strider

    strider Erfahrener Benutzer

    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.
     
    Hagebutt gefällt das.
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGT] Warum bekomme ich hier eine NullPointerException Android App Entwicklung 07.10.2017
[GESCHLOSSEN] Random ListItem ausgeben funktioniert nicht mehr Android App Entwicklung 13.08.2017
[OFFEN] Bild per Intent an ListView übergeben und anzeigen Android App Entwicklung 13.08.2017
[ERLEDIGT] Listview mit Datenbank über Custom ArrayList verbinden Android App Entwicklung 22.04.2017
[ERLEDIGT] Drawer mit scrollbarem Listview Android App Entwicklung 27.03.2017
ListView fix am unteren Bildschirmrand ausgeben Android App Entwicklung 01.03.2017
Warum erhalte ich ein "IllegalArgumentException" zur Laufzeit ? Android App Entwicklung 02.02.2017
Wie wird RelativeLayout.LayoutParams richtig angewendet ? Android App Entwicklung 24.01.2017
ProgressBar in ListView Android App Entwicklung 03.01.2017
Search Custom Adapter Android App Entwicklung 02.01.2017
Du betrachtest das Thema "ListView-Adapter funzt nicht richtig -> warum?" im Forum "Android App Entwicklung",