0

Ich möchte OnClickListener auf meine Songs RecyclerView implementieren. Wenn ich auf ein Objekt klicke, wird das OnClick-Ereignis ausgelöst, aber es wird auf mehr als ein Objekt ausgelöst. aber es sollte für den Gegenstand abgefeuert werden, den ich angezapft habe. Es wird auch auf zufällige Reihen von RecyclerView gefeuert. zum Beispiel, wenn ich auf die erste Zeile von RecyclerView klicke, wird OnClick-Ereignis auf zufällige Positionen, sagen am 7., 15., 28. .... 112. viel mehr gefeuert. Ich denke, es wird recycelt, so dass dies passiert.OnClickListener von RecyclerView funktioniert nicht richtig

Zuerst wurde es nicht auf zufällige Positionen gefeuert. zum Beispiel, wenn ein Klick auf die 1. Position auf ein Klick-Ereignis auf die erste Position und auch auf den 12., 21., 31., d.h. auf jede 12. Position, gefeuert wurde. es war periodisch, aber jetzt ist es nur zufällig.

Ich habe versucht, viele Methoden wie:

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

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

Ich habe auch viele andere Methoden ausprobiert, aber leider kann ich nicht Link zur Verfügung stellen, weil ich, dass mehr als 10 Ruf benötigen, sorry.

Folgende ist meine viewholder Klasse:

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

und wenn Sie sehen möchten, finden Sie meine Adapterklasse:

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

wenn ich einen Toast in Onclick Verfahren bereitzustellen, Mit der Position, anstatt die Recycleransicht zu erweitern, funktioniert es perfekt, es wird weder zufällig noch in regelmäßigen Abständen erzeugt.

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

Antwort

2

legte den Klick listner auf dem 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

beide Methoden sind die gleichen nichts ändert sich, ob ich expandChild.setOnClickListener (this) oder itemView.setOnClickListener (new View.OnClickListener() { @Override public void onClick (View v) { // beliebiger Code hier } }); Ich habe diese Methode auch versucht. – Anunay

0
diese

Versuchen:

  • einen Listener erstellen für Elemente im Hinblick auf Inhaber klicken.

    public interface ListItemListener { 
    
         void onButtonClick(String anyValue); // parameter is optional. If you want to get any value on its implementation then use. 
        } 
    
  • verwenden Zuhörer in Ihrem RecyclerView Adapter im Konstruktor.

     private ListItemListener mItemListener; 
    
         // Constructor 
         public YuueRecyclerViewAdapter(List<Data> mData, RecentItemListener itemListener) { 
    
          this.data = mData; 
          mItemListener = itemListener; 
         } 
    
  • verwenden in View-Halter

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

     } 
  • Implementieren Sie diese Zuhörer auf Ihre Aktivität/Fragment, wo Sieverwenden.
+0

Ich habe diese Methode auch aus einer Antwort von stackoverflow versucht, aber es hat nicht funktioniert. Nachdem du vorgeschlagen hast, habe ich es erneut versucht, aber nicht funktioniert. – Anunay

+0

Dies hat ein weiteres Problem, dass es Nullzeiger Ausnahme beim Zugriff auf eine bestimmte Ansicht von recyclerview aus Fragment wirft, obwohl ich verband diese Ansicht in meinem Fragment – Anunay

+0

warten .. Ich werde meine Antwort nach 30 Minuten aktualisieren –