1. inspire, 08.02.2011 #1
    inspire

    inspire Threadstarter Android-Hilfe.de 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: 08.02.2011
  2. xstream, 17.04.2011 #2
    xstream

    xstream Neuer Benutzer

    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

    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

    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