0

Я хочу реализовать OnClickListener на моих песнях RecyclerView. всякий раз, когда я нажимаю на какой-либо элемент, событие OnClick запускается, но оно срабатывает более чем на одном элементе. но его нужно уволить за элемент, который я использовал. Он также запускается в случайных рядах RecyclerView. например, когда я нажимаю на первую строку RecyclerView, событие OnClick запускается на случайных позициях, скажем, на 7, 15, 28, 112 и далее. Я думаю, что он перерабатывается, так что это происходит.OnClickListener RecyclerView не работает должным образом

Сначала он не уволялся на случайных позициях. например, если щелкнуть по 1-й позиции, событие onclick было запущено в 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); 
    } 
} 

и если вы хотите, чтобы увидеть, следуя мой адаптер класса:

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

если я обеспечиваю тост в OnClick метод с позицией, а не с расширением recyclerview, она отлично работает, ее не генерируют со случайным положением и не периодически.

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 (новый вид.OnClickListener() { @Override public void onClick (View 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; 
         } 
    
  • Используйте это в View Holder

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

OnCreateViewHolder

 @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); 

     } 
  • Реализовать этот приемник на вашей активности/фрагмента, где вы используете RecyclerView.
+0

Я пробовал этот метод также из ответа из stackoverflow, но он не сработал. После того, как вы предложили мне попробовать, но не сработали. – Anunay

+0

У этого есть еще одна проблема, что он выбрасывает исключение Null указателя при доступе к определенному представлению recyclerview из фрагмента, хотя я привязал это представление в своем фрагменте – Anunay

+0

wait .. Я обновлю свой ответ после 30 минут –