0

私はテキストと再生一時停止ボタン付きのカスタムリストビューを持っています。再生ボタンをクリックしたときに再生ボタンが見えなくなるようにしようとしています。しかし、私はonClickでそれを行うとき、間違った位置のボタンはlistviewで消えています。好き。ボタン:A - B - C - D - E、CをクリックするとEが見えなくなります。私はどのように処理するか分からない、助けてください。setVisibilityはカスタムの間違ったボタンを調整しますListview

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; 
} 

}

答えて

0

viewHolderクラスのメンバ変数です。 (ViewHolder viewHolder = new ViewHolder())、getView()convertViewを入力するたびにnullとなると、同じviewHolderが設定されます。その結果、getView()に最後に設定された値はonClick()で操作されたものです。 convertViewがnullの場合は、新しいビューホルダーを作成し、同じメンバ変数を使用することをお勧めします。

this tutorialをご覧ください。クラスPersonsAdaptergetView()を見てください。新しいビューが作成されるたびに新しいビューホルダーが作成されます。新しく作成されたビューアのボタンにonClickListenerを設定します。

ここであなたの再加工されたgetView()です。それはテストされていませんが、あなたに正しいアイデアを与える必要があります。がんばろう!あなたがボタンにタグとしてpostion設定とonclickListnerでそのタグを確認することができます

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

おかげで、私は、私は自分のコードに基づいて勧告を適用するのに十分な知識をAndroid上で新しいものではない持っています。サンプルコードで何をすべきか説明してください。 – PinkRabbits

+0

@PinkRabbits私は良い例をオンラインで探し、ここに投稿します。それは助けになるはずです。 – Cheticamp

+0

@PinkRabbits更新された回答を参照してください。私はこれが役立つことを願っています – Cheticamp

0

最後のビューがボタン上の行の位置を取得するには、最後の

でレンダリングするので、あなたが最後のIDまたは最後の行の位置を毎回取得しているをクリックしてくださいあなたの

getview() 

方法で例えば

はあなたのviewholder.btnにタグなどの位置を置く

viewHolder.btn.setTag(position); 

とOnClickListner

チェックタグ

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

参照のためにコメントをsee this post

+0

私はこの観点から考えなかった、助けてくれてありがとう – PinkRabbits

関連する問題