0

J'ai une liste personnalisée avec des boutons texte et lecture-pause. J'essaie de rendre le bouton de lecture invisible quand le bouton de lecture a cliqué. Mais quand je fais ça dans onClick, le bouton à la mauvaise position disparaît sur listview. Comme; boutons: A - B - C - D - E, quand je clique sur C, alors E devient invisible. Je n'ai aucune idée de comment gérer, s'il vous plaît aider.setVisibility ajuste le mauvais bouton dans la liste personnalisée

public class MyListAdapter extends ArrayAdapter<String> { 

private String[] gelenurl; 
List<String> gelen_ad; 
MediaPlayer mPlayer= new MediaPlayer(); 

private int[] IMAGE_ID = {R.drawable.police}; 
private int layout; 
public MyListAdapter(Context context, int resource, List<String> objects, String[] arr) { 
    super(context, resource, objects); 
    layout=resource; 
    gelenurl=arr; 
    gelen_ad=objects; 
} 


ViewHolder viewHolder = new ViewHolder(); 
@NonNull 
@Override 

public View getView(final int position, View convertView, ViewGroup parent) { 

    ViewHolder mainViewholder = null; 
    convertView=null; 

    if(convertView==null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView=inflater.inflate(layout, parent, false); 

     viewHolder.img = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
     viewHolder.img.setImageResource(IMAGE_ID[0]); 
     viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
     viewHolder.title.setText(getItem(position)); 
     viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 
     viewHolder.stop_button = (Button) convertView.findViewById(R.id.list_item_stop_btn); 

     convertView.setTag(viewHolder); 

    } 

    else { 

     mainViewholder = (ViewHolder) convertView.getTag(); 
     mainViewholder.title.setText(getItem(position)); 

    } 

    viewHolder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 

       viewHolder.button.setVisibility(View.INVISIBLE); 
       radioLinks(gelenurl[position]); 


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 


     public void radioLinks(String city) throws IOException { 

      if(mPlayer.isPlaying()) { 

       mPlayer.stop(); 
       mPlayer.reset(); 


      } 

      mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mPlayer.setDataSource(city); 
      mPlayer.prepareAsync(); 


      mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 

        mPlayer.start(); 

       } 
      }); 

     } 

    }); 

    viewHolder.stop_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mPlayer.stop(); 
      mPlayer.reset(); 
     } 
    }); 
    return convertView; 
} 

}

Répondre

0

viewHolder est une variable de membre de classe. (ViewHolder viewHolder = new ViewHolder()), donc chaque fois que vous entrez getView() et convertView est null, vous configurez le même viewHolder. Par conséquent, les valeurs les plus récentes définies dans getView() correspondent à ce qui est utilisé dans onClick(). Vous voulez probablement créer un nouveau support de vue lorsque convertView est null plutôt que d'utiliser la même variable membre.

Jetez un coup d'œil à this tutorial. Regardez getView() dans la classe PersonsAdapter. Un nouveau titulaire de vue est créé chaque fois qu'une nouvelle vue est créée. Vous devrez définir votre onClickListener sur le bouton dans ce nouveau viewholder.

Voici votre getView() retravaillé. Ce n'est pas testé, mais devrait vous donner la bonne idée. Bonne chance!

public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder mainViewholder; 

//  convertView = null; you don't need this if you reuse the view properly 
     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      mainViewholder = new ViewHolder(); 
      convertView.setTag(mainViewholder); 
     } else { 
      // If you are reusing a view, you may need to reset values in its view holder. 
      mainViewholder = (ViewHolder) convertView.getTag(); 
     } 

     // You always need to set you viewholder member variables whether creating a new 
     // view or converting an old view. 
     mainViewholder.img = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
     mainViewholder.img.setImageResource(IMAGE_ID[0]); 
     mainViewholder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
     mainViewholder.title.setText(getItem(position)); 
     mainViewholder.button = (Button) convertView.findViewById(R.id.list_item_btn); 
     mainViewholder.stop_button = (Button) convertView.findViewById(R.id.list_item_stop_btn); 

     final ViewHolder vh = mainViewholder; // final to use in the click listener 
     mainViewholder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        vh.button.setVisibility(View.INVISIBLE); 
        radioLinks(gelenurl[position]); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
+0

Merci pour commentaires, je suis nouveau sur Android, je n'ai pas assez de connaissances pour appliquer vos recommandations sur mon code . s'il vous plaît pouvez-vous expliquer avec un exemple de code que dois-je faire? – PinkRabbits

+0

@PinkRabbits Je vais chercher un bon exemple en ligne et le poster ici. Cela devrait être utile. – Cheticamp

+0

@PinkRabbits Voir la mise à jour de la réponse. J'espère que ça aide. – Cheticamp

0

Votre deviennent dernière id ou la dernière position de la ligne à chaque fois parce que la dernière vue rend enfin

Pour obtenir la position de la ligne sur le bouton clic, vous pouvez définir postion sous forme de balises à vos boutons et vérifiez que les balises dans onclickListner

Par exemple, dans votre

getview() 
méthode

mettre position en tant que balises dans votre viewholder.btn

viewHolder.btn.setTag(position); 

et OnClickListner

tag Vérifiez

int position = (int)v.getTag(); 

pour référence see this post

+0

je n'ai pas considéré de ce point de vue, merci beaucoup pour l'aide – PinkRabbits