java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Mobile Geräte

Mobile Geräte J2ME, Android

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 16.01.2012, 20:06   #1 (permalink)
Benutzer
int
 
Registriert seit: 21.11.2009
Fachbeiträge: 41
Abgegebene Danke: 33
Erhielt 1 Danke für 1 Beitrag
Standard Android: ListView-Adapter: Adapter wird ständig aufgerufen

Hi Forum,

ich habe mir einen Adapter geschrieben damit ich in eine ListView abwechselnd einen String und eine RadioButtonGroup einfügen kann. Soweit funzt das auch.

Leider wenn meine ListView zu groß wird und ich zu scrollen anfange (was erwünscht ist), duplizieren sich die Einträge.

Durch den Debugger habe ich erkannt, das der Adapter immer dann wenn die View weiter scrollt, wieder aufgerufen wird und das ist etwas unschön.

Zuerst hab ich versucht es mit einem "ViewHolder" zu lösen, indem ich das ganze mit view.setTag(holder) speichere und dann wieder hole. Leider stand im Tag nur der String und nie die RadioButtonGroup d.h. ich hab zwar meine Strings angezeigt bekommen aber meine Auswahlmöglichkeiten waren weg.

Google hat mir verraten das man auch eien ViewBinder schreiben kann aber da steh ich völlig auf dem Schlauch, da ich nicht verstehe wie bzw. wann der Adapter die getViewValue() aufruft.


Der Code:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package tsystem.adapter;
 
import java.util.ArrayList;
 
import tsystem.activity.R;
 
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
 
import android.widget.TextView;
 
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;
 
              if (v == null || v.getTag()==null) {
                  LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  v = vi.inflate(R.layout.list_items, null);
                  
 
              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);
                  }
                  else if(o instanceof String[]){
                      mRadioGroup = (RadioGroup)v.findViewById(R.id.radiobuttons);
                      mRadioGroup.setPadding(15, 10, 15, 10);
                      createRadioButtons((String[]) o);
                  }
                  
              }
              }
              else{
              }
              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);
                }
    }
}


Frage:

Hat jemand eine Idee wie ich die öfteren Aufrufe dazu bringe mir die Werte die ich ihm am Anfang übergebe zu behalten, ohne mir die Reihenfolge durcheinander zu bringen, noch die Einträge zu duplizieren?


Grüße
thaFlasher
Thaflasher ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 17.01.2012, 12:11   #2 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 21.11.2009
Fachbeiträge: 41
Abgegebene Danke: 33
Erhielt 1 Danke für 1 Beitrag
Update:

habe nun das ganze nochmal mit dem ViewHolder versucht.

Hier die geänderte getView

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@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;
              
      }


Jetzt behält er schon mal Daten und dupliziert auch nichts mehr. Leider gibt es immer noch eine Störung:

Bevor der User seine Ergebnisse abgeschickt hat, überprüfe ich ob er auch alle RadioButtons angeklickt hat. D.h. ich gehe die ListView von oben bis unten durch und drücke auf absenden.
Leider nehmen jetzt alle obrigen Werte null an, bis ich wieder hoch scrolle. Dann geht das abschicken da die unten Objekte nicht null werden.

Frage:

Warum zur Hölle ist das so?
Thaflasher ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 17.01.2012, 13:22   #3 (permalink)
Stammbenutzer
Megabyte
 
Benutzerbild von schlingel
 
Registriert seit: 17.12.2010
Fachbeiträge: 1.132
Abgegebene Danke: 11
Erhielt 259 Danke für 236 Beiträge
Antwort: Weil Android um Ressourcen zu sparen die Views zerstört die gerade nicht sichtbar sind. Muss nicht sein, kann es aber - wie eben in deinem Fall.

Doch des Pudels Kern ist nicht Android Sparsamkeit sondern dein Design-Fehler: Um solche Grauslichkeiten zu vermeiden musst du Logik bzw. Daten von UI bzw. View trennen.

Steck also einen EventHandler in deine Checkboxen die das jeweilige Attribut in einer Modelklasse an der aktuellen Position setzen und gut ist. Daraus folgt allerdings auch, dass du eine Modelklasse schreiben musst die deine Checkboxes bzw. deinen String ordentlich abbildet.

PS: "LayoutInflater.from(context)" => deutlich schöner und schneller getippt als "context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);"
__________________
Es gibt nichts Gutes, außer man tut es!

Probleme mit Android? Debugge mit Logcat um die Exception herauszufinden!
schlingel ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Thaflasher (17.01.2012)
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
WARUM wird paintComponent nicht aufgerufen? ernst AWT, Swing, JavaFX & SWT 12 07.02.2010 15:05
Resource Adapter MDB Problem Glassfish just82 Allgemeines EE 0 11.06.2009 17:56
Frage zu Eclipse Adapter Mechanismus Plattformprogrammierung 2 19.10.2006 16:07
mehrfachauswahl AWT, Swing, JavaFX & SWT 4 13.07.2005 16:42
welche Methode wird beim verstellen der Grösse aufgerufen dotlens AWT, Swing, JavaFX & SWT 5 21.10.2004 15:16


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de