notifyDataSetChanged macht Layout kaputt

  • 3 Antworten
  • Neuester Beitrag
Diskutiere notifyDataSetChanged macht Layout kaputt im Android App Entwicklung im Bereich Betriebssysteme & Apps.
I

inspire

Ambitioniertes Mitglied
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:
X

xstream

Neues Mitglied
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?
 
T

ts-apps

Fortgeschrittenes Mitglied
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"
 
X

xstream

Neues Mitglied
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:
Ähnliche Themen - notifyDataSetChanged macht Layout kaputt Antworten Datum
1