0

OnClickListenerを実装します。何かをタップするたびに、OnClickイベントは発生しますが、複数のアイテムで発生します。それは私がタップしたアイテムのために解雇されるべきです。また、RecyclerViewのランダムな行でも発生します。たとえば、RecyclerViewの最初の行をクリックすると、OnClickイベントがランダムポジションで発生します。たとえば、7th、15th、28th ... 112thより多くのイベントが発生します。私はそれがリサイクルされると思うので、これが起こります。RecyclerViewのOnClickListenerが正しく機能していません

最初はランダムな位置で解雇されていませんでした。たとえば、第1の位置をクリックすると第1の位置で、また第12,21,31から12番目の位置でクリックされた場合、それは周期的でしたが、今はランダムです。

私のような多くの方法を試してみました:

http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

https://stackoverflow.com/a/24746411/4754718

私はそれのために10以上の評判を必要とするので、私は申し訳ありませんが、リンクを提供カントも多くの他の方法を試してみましたが、申し訳ありませんしています。続き

は私のviewholderクラスです:

import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.HorizontalScrollView; 
import android.widget.ImageButton; 
import android.widget.TextView; 
/** 
* Created by anunay on 7/11/2016. 
*/ 
public class SongsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    public TextView songName; 
    public TextView artistName; 
    public TextView songDuration; 
    public ImageButton expandChild; 
    public Button playNow; 
    public Button playNext; 
    public Button addToQueue; 
    public Button addToPlayList; 
    public Button editMetadata; 
    public Button delete; 
    public static HorizontalScrollView horizontal_scroll; 


    public SongsViewHolder(final View itemView) { 
     super(itemView); 

     songName = (TextView) itemView.findViewById(R.id.songNameText); 
     artistName = (TextView) itemView.findViewById(R.id.artistNameText); 
     songDuration = (TextView) itemView.findViewById(R.id.songDuration); 
     expandChild = (ImageButton) itemView.findViewById(R.id.expandCollapseBtn); 
     playNow = (Button) itemView.findViewById(R.id.playNowBtn); 
     playNext = (Button) itemView.findViewById(R.id.playNextBtn); 
     addToQueue = (Button) itemView.findViewById(R.id.addToQueueBtn); 
     addToPlayList = (Button) itemView.findViewById(R.id.addToPlaylistBtn); 
     editMetadata = (Button) itemView.findViewById(R.id.editMetaDataBtn); 
     delete = (Button) itemView.findViewById(R.id.deleteBtn); 
     horizontal_scroll = (HorizontalScrollView) itemView.findViewById(R.id.childSection); 

     expandChild.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View view) { 
     horizontal_scroll.setVisibility(View.VISIBLE); 
    } 
} 

、あなたが見たい場合は、次のように私のアダプタクラスである:私はonclickの方法で乾杯を提供する場合

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by anunay on 7/11/2016. 
*/ 
public class SongsAdapter extends RecyclerView.Adapter<SongsViewHolder> { 

    // private ArrayList<Song> mSongsArrayList; 

    private final List<Song> mSongsArrayList; 
    private Context mContext; 


    public SongsAdapter(Context context, ArrayList<Song> songsArrayList) { 

     mSongsArrayList = songsArrayList; 
     mContext = context; 

    } 

    private Context getContext() { 
     return mContext; 
    } 

    @Override 
    public SongsViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { 
     Context context = parent.getContext(); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     View songsView = inflater.inflate(R.layout.songs_item, parent, false); 

     SongsViewHolder songsViewHolder = new SongsViewHolder(songsView); 
     return songsViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final SongsViewHolder holder, int position) { 

     Song currSong = mSongsArrayList.get(position); 

     TextView songNameText = holder.songName; 
     songNameText.setText(currSong.getTitle()); 
     TextView artistNameText = holder.artistName; 
     artistNameText.setText(currSong.getArtist()); 
     TextView songDurationText = holder.songDuration; 

     songDurationText.setText(currSong.getDurationString()); 
    } 

    @Override 
    public int getItemCount() { 
     return mSongsArrayList.size(); 
    } 

} 

and this is my screen shot

位置はリサイクルビューを展開する代わりに完全に動作し、ランダムポジションでも定期的にも生成されません。

expandChild.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // horizontal_scroll.setVisibility(View.VISIBLE); 

       Toast.makeText(view.getContext(), "clicked at position : "+getAdapterPosition(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

答えて

2

はitemView上のクリックのリスナーを置く:

public SongsViewHolder(final View itemView) { 
    super(itemView); 

    songName = (TextView) itemView.findViewById(R.id.songNameText); 
    artistName = (TextView) itemView.findViewById(R.id.artistNameText); 
    songDuration = (TextView) itemView.findViewById(R.id.songDuration); 
    expandChild = (ImageButton) itemView.findViewById(R.id.expandCollapseBtn); 
    playNow = (Button) itemView.findViewById(R.id.playNowBtn); 
    playNext = (Button) itemView.findViewById(R.id.playNextBtn); 
    addToQueue = (Button) itemView.findViewById(R.id.addToQueueBtn); 
    addToPlayList = (Button) itemView.findViewById(R.id.addToPlaylistBtn); 
    editMetadata = (Button) itemView.findViewById(R.id.editMetaDataBtn); 
    delete = (Button) itemView.findViewById(R.id.deleteBtn); 
    horizontal_scroll = (HorizontalScrollView) itemView.findViewById(R.id.childSection); 

    //expandChild.setOnClickListener(this); 

    itemView.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       //any code here 
      } 
     }); 


} 
+0

どちらのメソッドも、expandChild.setOnClickListener(this)またはitemView.setOnClickListener(new View)のどちらを使用しても同じ変更はありません。OnClickListener(){ @Override public void onClick(vを表示){ //ここに任意のコード } });私もこの方法を試みました。 – Anunay

0

はこれを試してみてください:

  • は、ビューホルダーでクリック項目のためのリスナーを作成します。

    public interface ListItemListener { 
    
         void onButtonClick(String anyValue); // parameter is optional. If you want to get any value on its implementation then use. 
        } 
    
  • コンストラクタでのごRecyclerViewアダプタでこのリスナーを使用します。

     private ListItemListener mItemListener; 
    
         // Constructor 
         public YuueRecyclerViewAdapter(List<Data> mData, RecentItemListener itemListener) { 
    
          this.data = mData; 
          mItemListener = itemListener; 
         } 
    
  • 使用このビューホルダーで

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
           @Nullable 
    @BindView(R.id.recent_title) 
    TextView titleTextView; 
    
    public ItemViewHolder(View itemView, ListItemListener listener) { 
        super(itemView); 
        ButterKnife.bind(this, itemView); 
        mItemListener = listener; 
        titleTextView.setOnClickListener(this); 
    } 
    
    @Override 
    public void onClick(View v) { 
         mItemListener.onButtonClick(mData); // mData is sent if you have any parameter there. 
    } 
    

 @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      context = parent.getContext(); 
      LayoutInflater inflater = LayoutInflater.from(context); 
      View progressView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_loading_item, parent, false); 
      return new ItemViewHolder(view, mItemListener); 

     } 
  • OnCreateViewHolderあなたはを使用しているあなたの活動/フラグメントにこのリスナーを実装。
+0

私はこのメソッドをstackoverflowからの回答からも試してみましたが、うまくいきませんでした。あなたは私が再び試したことを提案した後、働いていませんでした。 – Anunay

+0

これはもう1つの問題があります。フラグメントからそのビューをバインドしても、フラグメントからrecyclerviewの特定のビューにアクセスしている間にNullポインタ例外がスローされます。 – Anunay

+0

待ちます。 –

関連する問題