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

notifyDataSetChanged macht Layout kaputt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von inspire, 08.02.2011.

  1. inspire, 08.02.2011 #1
    inspire

    inspire Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    78
    Erhaltene Danke:
    3
    Registriert seit:
    03.01.2010
    Hi,

    ein ListView bei mir scheint sich komisch zu verhalten. Es beinhaltet einfache Elemente dieser Art:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_height="wrap_content" 
        android:gravity="left|center"
        android:layout_width="fill_parent" >
        
        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_height="wrap_content" 
            android:gravity="left|center"
            android:layout_width="wrap_content" 
            android:paddingBottom="5dp"
            android:paddingTop="5dp" 
            android:paddingLeft="5dp"
            android:orientation="vertical">
            
                <TextView 
                android:id="@+string/TextView01" 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:gravity="center"
                android:textColor="#FFFFFF"
                android:textSize="20sp"></TextView>
                
                <TextView android:text="" 
                android:id="@+string/TextView02"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:textSize="12sp"
                [B]android:visibility="invisible"[/B]></TextView>
        </LinearLayout>
    
        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_height="wrap_content" 
            android:gravity="right|center"
            android:layout_width="fill_parent" >
            
            <CheckBox android:id="@+string/CheckBox01"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content" android:gravity="right|center_vertical"
               android:focusable="false"
               android:focusableInTouchMode="false"
               [B]android:visibility="invisible"[/B]
               />
               
        </LinearLayout>
    
    </LinearLayout>
    Die visibility-Attribute sollen standard sein.

    Dieses ListView bekommt mit setAdapter nun einen selbst definierten Adapter, der so aussieht:

    Code:
    static class EfficientAdapter extends BaseAdapter {
            private LayoutInflater mInflater;
    
            public EfficientAdapter(Context context) {
                mInflater = LayoutInflater.from(context);
            }
    
            public int getCount() {
                return listoptions.length;
            }
    
            public Object getItem(int position) {
                return position;
            }
    
            public long getItemId(int position) {
                return position;
            }
    
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                
                View row = convertView;
    
                if (row == null)
                    convertView = mInflater.inflate(R.layout.listview, null);
                
                
                holder = new ViewHolder();
                holder.checkbox = (CheckBox) convertView.findViewById(R.string.CheckBox01);
                holder.title = (TextView) convertView.findViewById(R.string.TextView01);
                holder.status = (TextView) convertView.findViewById(R.string.TextView02);
                
                holder.title.setText(listoptions[position]);
                holder.status.setText(liststatus[position]);
                
                
                if ((liststatus[position].toString().equals("on")) || (liststatus[position].toString().equals("off"))) 
                {    // ELEMENTS WITH CHECKBOX
                    holder.checkbox.setVisibility(0);
                    
                    if (liststatus[position].toString().equals("on"))
                        holder.checkbox.setChecked(true);
    
                } 
                else
                {    // ELEMENTS WITHOUT CHECKBOX
                    holder.status.setVisibility(0);
                }
                
    
                return convertView;
            }
    
            class ViewHolder {
                TextView title;
                TextView status;
                CheckBox checkbox;
            }
        }
    Durch eine onItemClick-Methode wird nun notifyDataSetChanged des Adapters aufgerufen. Die getView-Methode wird dabei wieder durchlaufen - doch plötzlich sind das TextView und die CheckBox anderen Elementen des ListView auch sichtbar! Dabei sollen die Visibility-Attribute nur bei ganz bestimmten Elementen verändert werden...Irgendwie wird das ListView nicht richtig refresht.

    Was mache ich falsch?

    Martin
     
    Zuletzt bearbeitet: 08.02.2011
  2. xstream, 17.04.2011 #2
    xstream

    xstream Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    17.04.2011
    ich habe ein ähnliches problem, ich benutze ein imageview namens icon und sobald ich holder.icon.setVisibility(View.INVISIBLE); ausführe verschwinden alle icons in meinem spinner, nicht nur das icon was ich invisible setzen wollte. hast du mittlerweile eine lösung oder zumindest ein workaround gefunden?
     
  3. ts-apps, 17.04.2011 #3
    ts-apps

    ts-apps Erfahrener Benutzer

    Beiträge:
    194
    Erhaltene Danke:
    39
    Registriert seit:
    27.03.2010
    Naja wenn deine ListItems alle die gleiche ID haben wunderts mich nicht das dein Layout bei einer Änderung zerschossen wird.

    Zumal die IDs doch wie folgt vergeben werden:
    android:id="@+id/tv_itemxy"
     
  4. xstream, 17.04.2011 #4
    xstream

    xstream Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    17.04.2011
    die items innerhalb einer reihe haben immer die gleiche id ja, aber die reihe an sich ist doch ein eigenes objekt. zumindest dachte ich bisher es wäre so oder wie erklärst du dass ich mit holder.text.setText(entryList.get(position)[0]); (entryList ist eine ArrayList die String Arrays enthält) ohne weiteres jeder reihe einen eigenen text zuweisen kann. die referenzimplementierung für sowas macht das doch auch nicht anders List14.java | Android Developers ?!

    :mad:inspire es ist übrigens effizienter das layout per relativelayout zu machen wenn du dadurch vermeiden kannst so viele layouts in einander zu packen http://www.curious-creature.org/2009/02/22/android-layout-tricks-1/
     
    Zuletzt bearbeitet: 17.04.2011

Diese Seite empfehlen