2010-07-07 5 views
2

Faire R & D pour mon entreprise. Nous essayons d'avoir un listView qui contient une imageview, et deux cases d'édition pour chaque entrée dans la listview.Ajout d'un viewGroup à un ListView?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:isScrollContainer="true" 
    android:focusableInTouchMode="false" 
    android:focusable="false"> 
    <ImageView android:id="@+id/imgView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:maxWidth="100dp" 
    android:maxHeight="100dp"/> 
    <LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <EditText android:id="@+id/img_title" 
    android:hint="Title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minWidth="150dp"/> 
    <EditText android:id="@+id/img_desc" 
    android:hint="Description" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minWidth="150dp"/> 
    </LinearLayout> 
</LinearLayout> 

Ceci est le fichier de mise en page que j'essaie d'utiliser pour l'élément qui sera dans la liste. Dans le getView de notre ImageAdapter (qui étend ArrayAdapter), j'essaye d'employer le LayoutInflater pour gonfler le xml, que je stocke alors dans un ViewGroup. Je trouve ViewByID() pour obtenir l'imageView dans le XML, et définir les propriétés de l'imageView que nous aimerions.

Si nous continuons à gonfler ce fichier xml, tous les identifiants seront les mêmes. Voici nos problèmes.

  1. Si on enlève un élément de liste avec un menu contextuel , il élimine en fait une incorrecte. Les tests montrent que c'est surtout le dernier ajouté, mais pas toujours.
  2. Les EditText ne répondent pas aux entrées au clavier. À l'occasion, ils stockent des données, généralement toujours «bbb».

Nous avons plus de problèmes, mais nous reviendrons après que nous ayons corrigé ces erreurs plus sérieuses.

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     final ImageView imageView; 
     //InputStream is = null; 
     final Context mContext = super.getContext(); 
     final AdapterItem item = super.getItem(position); 
     final Uri imageUri = item.getUri(); 
     ViewGroup viewGroup = null; 

     try 
     { 
      //-- If the view has not been created yet. 
      if (convertView == null) 
      { 
       /* 
       * Build the ImageView from the URI with some custom 
       * view settings. 
       */ 

       viewGroup = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.mediauploadobject, null); 
       imageView = (ImageView) viewGroup.findViewById(R.id.imgView); 
       //imageView.setLayoutParams(new GridView.LayoutParams(IMAGE_WIDTH, IMAGE_HEIGHT)); 
       imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
       imageView.setPadding(IMAGE_PADDING_LEFT, IMAGE_PADDING_TOP, 
         IMAGE_PADDING_RIGHT, IMAGE_PADDING_BOTTOM); 
       imageView.setDrawingCacheEnabled(true); 
       imageView.setClickable(true); 
       imageView.setFocusable(true); 
       imageView.setFocusableInTouchMode(true); 
       imageView.setSaveEnabled(false); 
       //the following two lines are required for the menu to popUp 
       imageView.setOnLongClickListener(new LongClickListener()); 
       imageView.setOnCreateContextMenuListener(new LongClickMenu()); 
       imageView.setOnClickListener(new ShortClickListener()); 

       //the following two lines are required to put a boarder around the images 
       imageView.setOnTouchListener(new PictureOnTouchListener()); 
       imageView.setOnFocusChangeListener(new PictureOnFocusChangeListener()); 

       //-- Keep a reference to the ImageView by tagging it. 
       imageView.setTag(imageUri); 
      }else 
      { 
       //-- R-E-C-Y-C-L-E recycle! 
       viewGroup = (ViewGroup) convertView; 
       imageView = (ImageView) viewGroup.findViewById(R.id.imgView); 
      } 

      //-- Lazy load the images so the user doesn't have to wait for all of the querying non-sense 
      // that happens behind the scenes. 
      imageView.setImageResource(android.R.drawable.gallery_thumb); 
      imageView.post(new ImageLoader(imageUri, imageView));   

      //-- Be VERY careful when changing this code. Due to heap size issues, 
      // the size of the bitmap image MUST be modified with the 
      // provided BitmapFactory.Options or the program will 
      // crash often and frequent. 
      //post 
      //-- AJG 7/1/2010 added this assignment so we aren't always setting these preferences every 
      // iteration 
      convertView = viewGroup; 
     }catch(Throwable t) 
     { 
      Log.e(TAG, t.toString()); 
      return null;    
     }finally 
     { 
      //try{if(is != null)is.close();}catch(Exception squish){} 
     } 

     return viewGroup; 
    } 
+0

Pouvez-vous publier le code pour votre adaptateur. –

+0

Si le problème concerne la suppression d'éléments, le code que vous utilisez pour supprimer des éléments peut vous aider à obtenir une réponse. Peu importe que les ID soient identiques, chaque élément de la liste aura une position unique dans la liste (ce qui est ce que vous utiliseriez pour supprimer un élément particulier). – kiswa

+0

J'ai corrigé l'erreur de suppression. Le code de l'adaptateur est d'environ 450 lignes. Je vais supposer que vous préférez voir la partie getView du code. Edited mon message original avec le code. – DavidAndroidDev

Répondre

2

Les vues ne sont pas focalisables dans une liste par défaut. Ceci permet d'éviter un comportement de trackball impair/de navigation sans contact. Cela pourrait être la raison pour laquelle vos edittexts ne répondent pas aux entrées. Assurez-vous que vous appelez la méthode ListView.setItemsCanFocus (true).

+1

Bien que ce n'était pas la solution à mon problème, c'était la réponse que j'ai généralement trouvée ailleurs. Merci, j'ai décidé d'instancier mon propre groupe de vues en tant que ligne dans une "fausse" liste en ajoutant simplement des groupes de vues à une disposition linéaire. – DavidAndroidDev

Questions connexes