Actionlistener für die Buttons in custom Gridview

  • 4 Antworten
  • Letztes Antwortdatum
Z

zblack

Gast
Hallo Freunde.
in meiner App verwende ich die Gridview als Liste und für jeden Eintrag habe ich ein Layout mit einem Textview und einem Button erstellt.
In meinem BaseAdapter habe ich alle Layoutkomponenten inflatet so dass ich Zugriff darauf habe.
Die getView des Adapters sieht dann so aus:
Code:
    public View getView(int position, View convertView, ViewGroup parent) {
        view = LayoutInflater.from(context).inflate(R.layout.checklist_entry, null);
        titelTv = (TextView) view.findViewById(R.id.titel_tv);
        editButton = (Button) view.findViewById(R.id.add_value_button);
        editButton.setOnClickListener(this);
        return view;
    }
Actionlistener sieht dann so aus:
Code:
public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()){
        case R.id.add_value_button:
            titelTv.setText("HALLO ??????");
            break;
        }
    }
Beide Funktionen sind in der selben BaseAdapter klasse.
Doch leder passieren bei der Ausführung total komische Sachen:
HALLO ??? wird auf die falsche Position gesetzt. Wenn man z.b auf den dritten eintrag der liste klickt, dann erscheint der Text erntweder garnicht, oder wird plötzlich auf dem vierten Eintrag gesetzt. Wenn man die Liste scrollt, verschwindet dann das gesetzte Text plötzlich und kommt nicht wieder.
Ich brauche Hilfe !
Mfg.
 
naja dein getview wird sehr oft ausgeführt, wodurch dein titelTv sich ständig ändert.


wenn du dann bei onClick drauf zugreifst, kann es irgendwas sein - onclick wird ja viel später erst ausgeführt.

das geht so dann nicht.

du könntest die view deinem button per setTag(view) mitgeben, die kannst dann aus der View v beim onClick wieder rauslesen
View that = (View)v.getTag();
dann kannst den titelTV daraus wieder inflaten.
 
es funktioniert.
mit
editButton.setTag(view);
und
Code:
public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()){
        case R.id.add_value_button:
            View that = (View)v.getTag();
            TextView tv = (TextView) that.findViewById(R.id.ist_wert_enter);
            tv.setText("HALLO ??????");
            break;
        }
    }
als Listener geht es. Das Hallo wird an richtigen stelle angezeigt. Was noch nicht so ganz funktioniert, das "hallo" verschwindet noch beim scrollen
 
ja dir fehlt das verständnis, wie eine listview funktioniert

die einzelnen zeilen werden wiederverwendet. deshalb auch das - du musst den wert irgendwo setzen und beim neu zeichnen der reihe wieder einfügen.

am besten du versucht zu verstehen, was die listview im detail macht
 
ich habe mal mit viewholder versucht. Es klappt eigentlich auch soweit. Nur habe ich jetzt ein Problem welches ich noch nicht gelöst habe:
ich setze in getView für jedes Button .setTag(contentview).
im actionlistener fange ich den Tag ab, inflate dann wieder die viewholder Buttons und setze text auf Button. (CODE dafür sieht so aus: )
Code:
public void onClick(View v) {
        
        switch (v.getId()){
        case R.id.date_now:
        {
            View x = (View) v.getTag();
            viewHolder.date = (Button) x.findViewById(R.id.date);
            viewHolder.time = (Button) x.findViewById(R.id.time);
            Calendar c = Calendar.getInstance();
            
            viewHolder.date.setText(sdf.format(c.getTime()));
            viewHolder.time.setText(stf.format(c.getTime()));
            viewHolder.date.setVisibility(View.VISIBLE);
            viewHolder.time.setVisibility(View.VISIBLE);
            
        }
            break;
    }
Das klappt, nur wenn ich skrolle, verschwinden plötzlich zwei von drei buttons und kommen nicht mehr wieder, so dass man die activity schließen muss. Warum eigentich ?
 
Zurück
Oben Unten