2017-06-15 1 views
0

Je fais une application dans laquelle il y a des messages avec des commentaires et une description. Il y a trois boutons sur chaque message. 1 description 2 commentaires et le troisième est comme le bouton. J'ai placé un écouteur de clic de bouton dans la méthode de getview d'adapteur fait sur commande. Quand je clique sur le bouton de description, la description de ce message devrait être affichée sous le bouton. Mais lorsque j'ai cliqué sur le bouton de description, la description de certains autres éléments listview s'affiche également. Je veux juste montrer la description de ce poste dont le bouton de description est cliqué. Voici mon code:En cliquant sur le bouton dans l'élément listview, le changement se produit également dans d'autres éléments listview

Code GetView:

public View getView(int position, View convertView, ViewGroup parent) { 
     a = getItem(position); 

     View view = convertView; 
     try 
     { 
      if (convertView == null) { 
       v = new ViewHolder(); 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_list_item, parent, false); 
       v.imgView = (ImageView) convertView.findViewById(R.id.iv_list_image); 
       v.desc = (Button) convertView.findViewById(R.id.btn_desc); 
       v.des = (TextView) convertView.findViewById(R.id.tv_list_desc); 
       v.ll = (LinearLayout) convertView.findViewById(R.id.ll_desc); 


       convertView.setTag(v); 
      } 
      else { 
       v = (ViewHolder) convertView.getTag(); 
      } 
      v.desc.setTag(position); 
      //Picasso.with(getContext()).load(a.getFile()).fit().into(v.imgView); 
      Glide.with(context).load(a.getFile()).centerCrop().placeholder(R.drawable.dualring).into(v.imgView); 

      v.desc.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v1) { 
        Toast.makeText(getContext(), ""+v.desc.getTag(), Toast.LENGTH_SHORT).show(); 
        v.des.setText(""+a.getDescription()); 
        v.ll.setVisibility(View.VISIBLE); 
       } 
      }); 


      return convertView; 

     }catch (Exception e) 
     { 
      return null; 
     } 

    } 

code XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="16dp" 
    android:paddingBottom="35dp"> 
    <ImageView 
     android:id="@+id/iv_list_image" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" /> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_weight="6"> 
     <Button 
      android:id="@+id/btn_desc" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:text="Description" 
      /> 
     <Button 
      android:id="@+id/btn_comment" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:text="Comments" 
      /> 
     <Button 
      android:id="@+id/btn_likes" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:text="Likes" 
      /> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/ll_desc" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="16dp" 
     android:background="#ffffff" 
     android:visibility="invisible" 
     > 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Description:" 
      android:textStyle="bold"/> 
     <TextView 
      android:id="@+id/tv_list_desc" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Default Desc" 
      android:textColor="#333" 
      /> 
    </LinearLayout> 
</LinearLayout> 

Répondre

0

C'est lorsque vous utilisez un drapeau int pour la position de l'élément de liste comme une instruction conditionnelle avant de mettre à jour les éléments de ListView.

Donc, dans votre cas, la classe d'adaptateur ressemblerait à quelque chose comme ceci:

... 

private int mPosition = -1; // Int flag that doesn't take effect UNTIL it has been set 

... 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    a = getItem(position); 

    View view = convertView; 
    try { 
     if (convertView == null) { 
      v = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_list_item, parent, false); 
      v.imgView = (ImageView) convertView.findViewById(R.id.iv_list_image); 
      v.desc = (Button) convertView.findViewById(R.id.btn_desc); 
      v.des = (TextView) convertView.findViewById(R.id.tv_list_desc); 
      v.ll = (LinearLayout) convertView.findViewById(R.id.ll_desc); 

      convertView.setTag(v); 
     } else { 
      v = (ViewHolder) convertView.getTag(); 
     } 

     v.desc.setTag(position); 

     //Picasso.with(getContext()).load(a.getFile()).fit().into(v.imgView); 
     Glide.with(context).load(a.getFile()).centerCrop().placeholder(R.drawable.dualring) 
       .into(v.imgView); 

     // Runs the following functionality if the positions match. Otherwise, hides the layout. 
     if (mPosition == position) { 
      Toast.makeText(getContext(), ""+v.desc.getTag(), Toast.LENGTH_SHORT).show(); 
      v.des.setText(""+a.getDescription()); 
      v.ll.setVisibility(View.VISIBLE); 
     } else { 
      v.ll.setVisibility(View.INVISIBLE); 
     } 

     v.desc.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v1) { 
       mPosition = position; // Sets the flag to the position that was clicked 

       notifyDataSetChanged(); // Updates the data instantly 
      } 
     }); 

     return convertView; 

    } catch (Exception e) { 
     return null; 
    } 
} 

Laissez-moi savoir si cela fonctionne.

+0

setonitemclicklistener ne fonctionne pas ici ... –

+0

@MuhammadAbdullah J'ai mis à jour la réponse. Essayez cela :-) – DaveNOTDavid

+1

Merci beaucoup. Ça marche maintenant. Tu sauves ma journée. Merci encore. –

0

La meilleure solution consiste à implémenter le programme d'écoute sur le clic dans l'adaptateur et à définir l'étiquette sur le bouton. Après cela, dans la méthode onclick effectuer la tâche désirée en obtenant l'ID tag du bouton, cela va certainement fonctionner.

+0

Merci pour la réponse. Je fais la même chose mais je reçois toujours le même problème .. –

+0

Votre code ne montre pas la même chose. Vous faites setonclicklistener directement sur la vue. –

+0

Maintenant, je implémente onClicklistener séparément mais même question .... s'il vous plaît aidez-moi –