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

Leere listView

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Maec, 06.02.2011.

  1. Maec, 06.02.2011 #1
    Maec

    Maec Threadstarter Neuer Benutzer

    Beiträge:
    2
    Erhaltene Danke:
    0
    Registriert seit:
    06.02.2011
    Hallo zusammen,

    ich habe folgendes Problem:

    Ich verwende eine Klasse welche von SimpleCursorAdapter erbt:

    Code:
    public class MyAdapter extends SimpleCursorAdapter {
    
    private Cursor cursor;
    private LayoutInflater inflater;
    
    private int columnIndexRowID;
    private int columnIndexFromAddrString;
    private int columnIndexToAddrString;
    
    public LastRequestsAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to) {
        super(context, layout, c, from, to);
        this.cursor = c;
        this.inflater = LayoutInflater.from(context);
    
        this.columnIndexRowID = c.getColumnIndex(MyDBAdapter.KEY_ROWID);
        this.columnIndexFromAddrString = c
                .getColumnIndex(MyDBAdapter.KEY_FROM_ADDR_STRING);
        this.columnIndexToAddrString = c
                .getColumnIndex(MyDBAdapter.KEY_TO_ADDR_STRING);
    
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        ViewHolder viewHolder;
    
        if(convertView==null){
    
            convertView = this.inflater.inflate(R.layout.main_activity_last_request_row, null);
            viewHolder = new ViewHolder();
            viewHolder.id = -1;
            viewHolder.fromAddr = (TextView) convertView.findViewById(R.id.from);
            viewHolder.toAddr =(TextView) convertView.findViewById(R.id.to);
            viewHolder.arrow = (ImageView) convertView.findViewById(R.id.last_request_arrow);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        this.cursor.moveToPosition(position);
    
        viewHolder.id = this.cursor.getInt(columnIndexRowID);
        viewHolder.fromAddr.setText(this.cursor.getString(this.columnIndexFromAddrString));
        viewHolder.toAddr.setText(this.cursor.getString(this.columnIndexToAddrString));
        viewHolder.arrow.setImageResource(R.drawable.arrow_alt);
    
        return convertView;
    
    }
    
    public class ViewHolder{
        public int id;
        public TextView fromAddr;
        public TextView toAddr;
        public ImageView arrow;
     }
    }
    Dies wird so verwendet:
    Code:
    listView.setAdapter(new MyAdapter(this,
                R.layout.main_activity_last_request_row, dbCursor,
                new String[] { MyDBAdapter.KEY_FROM_ADDR_STRING,
                        MyDBAdapter.KEY_TO_ADDR_STRING }, new int[] {
                        R.id.from, R.id.to }));
    Grundsätzlich funktioniert das Befüllen der Liste und das Darstellen wunderbar, bis auf eine Kleinigkeit: Meine Liste besitzt zusätzlich einige header-Elemente, von denen eines per default auf View.GONE gesetzt ist. Dieses Element kann ich über einen Menüpunkt sichtbar schalten (View.VISIBLE). Wenn ich dies nun tue, so verschwinden mit dem Sichtbar-Schalten des header-Elements plötzlich alle Einträge in meiner Liste (vielmehr scheint es als werden Sie unsichtbar bzw. aus den entsprechenden TextViews gelöscht - Im logcat sehe ich, dass die entsprechenden Werte da sind!). Schaltet man das header-Element nun wieder auf unsichtbar, so sind alle Einträge wieder sichtbar. Dieses Verhalten ist komischerweise nur ein einziges Mal direkt nach dem Start zu beobachten; heisst: Nachdem die Einträge verschwunden sind und wieder aufgetaucht sind, kann man dieses Verhalten nicht mehr reproduzieren!

    Was ich auch sehr interessant finde, ist der Fakt, dass ich diesen Fehler nur auf meinem Gerät reproduzieren kann. Im Emulator lässt sich dieser Fehler nicht reproduzieren, was das debuggen verhältnismäßig schwer macht.

    Kennt jemand dieses Phänomen? Das ganze handelt sich um ein Uni-Projekt bei welchem am Dienstag Abgabetermin ist, daher würde ich mich über eine Antwort besonders freuen!! ;)

    Danke schonmal im Voraus!
     
    Zuletzt bearbeitet: 06.02.2011
  2. Maec, 06.02.2011 #2
    Maec

    Maec Threadstarter Neuer Benutzer

    Beiträge:
    2
    Erhaltene Danke:
    0
    Registriert seit:
    06.02.2011
    Ok, ich habe mittlerweile heraus gefunden, dass der Fehler nicht auftritt, wenn ich das Überprüfen nach
    Code:
    (convertView == null)
    sein lasse. Ich verstehe aber immer noch nicht warum der Fehler sonst auftritt. Ich kann mit der Lösung leben, da sich unter 30 Elemente in meiner Liste befinden. Allerdings ist der nun eingeschlagene Weg des "Nicht-Wiederverwenden" von convertViews Performance-technisch sehr schlecht soweit ich gelernt habe, daher würde ich trotzdem gerne wissen, wo mein Fehler in der ursprünglichen Lösung liegt. Vielleicht kann mir das ja jemand von euch beantworten.
     

Diese Seite empfehlen