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

Eintrag kann nicht aus Gallery entfernt werden

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Gibbsnich, 11.10.2010.

  1. Gibbsnich, 11.10.2010 #1
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Hallo,

    mein Programm bietet unterschiedliche Views an, die über eine Gallery ausgewählt werden. Die notwendigen Daten dafür sind in einer eigenen Klasse definiert und stehen als Liste in meinem Adapter:
    Code:
    public class GalleryData extends BaseAdapter {
        int mGalleryItemBackground;
        private Context mContext;
        private List<GalleryRec> galData = new LinkedList<GalleryRec>(); 
    
    Das Löschen geht so:
    Code:
        public Boolean deleteGalleryData(Integer position) {
            if (BIS_Common.myDataBase != null && position >= 0 && position < galData.size()) { 
                BIS_Common.myDataBase.deleteDBSatz(galData.get(position).getDbIndex());
                this.galData.remove(position);
                return true;
            } else {
                return false;
            }
        }
    
    Der Debugger beweist, dass die DB ungleich NULL ist und die Bedinungen alle erfüllt sind, damit der Code überhaupt erreicht wird. Der Datensatz in der DB wird offensichtlich gelöscht, aber der Gallery-Eintrag bleibt stehen !
    Wenn ich darauf klicke, kann die passende View nicht gezeigt werden (DB-Eintrag ist ja futsch), aber der Eintrag verschwindet nicht.

    Der Aufruf des Löschens:
    Code:
                    BIS_Common.myGalleryData.deleteGalleryData(galItem);
                    BIS_Common.myGallery.invalidate();
    BIS_Common.myGallery.setAdapter(BIS_Common.myGalleryData);
                    BIS_Common.myGallery.invalidate();
    
    Was fehlt hier noch ??

    Ein letzter, verzweifelter Test offenbart mir gearde, dass ein Liste.clear ebensowenig geht.
    Auch hier wird zwar dieDB geleert, die Gallery bleibt aber in vollem Umfang erhalten.

    HILFE!! :ohmy:
     
  2. Unicate, 11.10.2010 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Musst du nicht der View noch mitteilen, das sich die Daten geändert habven (adapter.notifyDataSetChanged())?
    Oder hast du das schon getan und nur nicht mit gepostet?

    Zumindest wenn der Adapter ein CursorAdapter ist, was man hier nicht sehen kann.
     
  3. Gibbsnich, 11.10.2010 #3
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Hallo Unicate,

    schade, das war es leider nicht.
    Es ist auch kein Cursoradapter, sondern nur eine Datenstruktur:
    Code:
    class GalleryRec {
        protected Integer dbIndex = 0;
        protected Integer typ = 0;
        protected String titel = "";
        public GalleryRec(Integer dbIndex, Integer typ, String titel) {
            super();
            this.dbIndex = dbIndex;
            this.typ = typ;
            this.titel = titel;
        }
        public Integer getDbIndex() {
            return dbIndex;
        }
        public Integer getTyp() {
            return typ;
        }
        public String getTitel() {
            return titel;
        }
    }
    
    Der Adapter verwaltet diese Klasse in einer Liste:
    Code:
    private List<GalleryRec> galData = new LinkedList<GalleryRec>();
    Der Vollständigkeit halber hier noch die Methode getView(), die letztlich einen 2-zeiligen Text ausgibt:
    Code:
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView v = new TextView(mContext);
            int breite;
            Paint p = new Paint();
            GalleryRec gRec = null;
            String ausgabe = "" + position;
            if (position < galData.size()) {
                gRec = galData.get(position);
                if (gRec != null) {
                    ausgabe = BIS_Common.getAnzeigeTyp(gRec.getTyp()) + "\n" +
                              gRec.getTitel();
                }
            }
    
            v.setBackgroundResource(mGalleryItemBackground);
            v.setText(ausgabe + " " + xx);
            v.setTextColor(0xffffffff);
            breite = Math.round(p.measureText(ausgabe));
            if (breite == 0) {
                breite = 100;
            }
            v.setLayoutParams(new Gallery.LayoutParams(breite + 10, 64));
            v.setGravity(Gravity.CENTER_HORIZONTAL);
            //v.setPadding(10, 0, 10, 0);
    
            return v;
        }
    
     
  4. Gibbsnich, 11.10.2010 #4
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Ich stelle gerade fest, dass der Aufruf "galData.remove(position)" false liefert !
    Dann ist klar, dass der Eintrag weiterhin sichtbar ist.
    Aber warum ist das so ?
    Wenn ich die Liste mit galData.add(new GalleryRec()) erweitern kann, warum scheitert dann ein remove ?
     
  5. Unicate, 11.10.2010 #5
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Achso, die Objekte in deiner GridView werden wieder verwendet.

    d.h. Wenn z.B. item an position 1 aus dem Bild nach oben verschwindet, dann wird es unten wieder weiter verwendet. (halt nur überschrieben, deswegen auch die new-View-sache bei den Adaptern)

    du solltest warscheinlich statt remove(position) etwas anderes verwenden.

    remove(long id) wäre besser. Wenn du die OnItemClick Methode aus der GridView nutzt sollte die id auch einfach zu bekommen sein.
     
    Zuletzt bearbeitet: 11.10.2010
  6. Gibbsnich, 11.10.2010 #6
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Nein, kein Recycling !
    Ich möchte einfach nur den aktiven Gallery-Eintrag entfernen, die Seiten davor und danach sollten bleiben.

    Ich erwähne das add() nur, weil ich bisher die Gallery so erweitere. Bei jedem neuen Dialog wird ein neuer Eintrag in die Gallery geschrieben.
    So weit, so gut.

    Jetzt soll einfach nur ein Eintrag aus der Liste entfernt werden.
    Ich habe das sowohl mit ArrayList als auch mit LinkedList probiert, beides scheitert.
     
  7. Unicate, 11.10.2010 #7
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ich bin mir grad nicht sicher ob wir aneinander vorbei reden.

    Überprüf doch mal ob die Positionen überhaupt stimmen, die du löschen willst.
     
  8. Gibbsnich, 11.10.2010 #8
    Gibbsnich

    Gibbsnich Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    56
    Erhaltene Danke:
    0
    Registriert seit:
    22.06.2010
    Hab ich gerade gemacht. Meine Position entspricht der ID in der Liste und ist vom Typ integer.
    Ich sehe im Objektinspektor, dass meine Liste 3 Einträge hat, versuche remove(1) und erhalte das Ergebnis false :mad2:

    Kann es damit zu tun haben, dass meine Liste aus einer eigenen Klasse besteht und dass ich dann das Löschen auch noch programmieren muss ?

    Ich dachte, das Entfernen aus der Liste reicht und der Garbage Collector kümmert sich um die nicht mehr benötigte Klasse.
     

Diese Seite empfehlen