1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ListView-Adapter funzt nicht richtig -> warum?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Hagebutt, 17.01.2012.

  1. Hagebutt, 17.01.2012 #1
    Hagebutt

    Hagebutt Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2011
    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

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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 bedankt sich.
  3. Hagebutt, 17.01.2012 #3
    Hagebutt

    Hagebutt Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2011
    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

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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 bedankt sich.
  5. strider, 17.01.2012 #5
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    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 bedankt sich.

Diese Seite empfehlen