notifyDataSetChanged macht Layout kaputt

I

inspire

Ambitioniertes Mitglied
3
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:
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?
 
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"
 
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

L
Antworten
4
Aufrufe
1.332
lonnie9020
L
A
Antworten
1
Aufrufe
879
koje71
koje71
T
Antworten
4
Aufrufe
1.230
jogimuc
J
Zurück
Oben Unten