RecyclerView的OnClickListener无法正常工作

时间:2016-07-19 08:20:29

标签: android android-recyclerview onclicklistener audio-player android-music-player

我想在我的歌OnClickListener上实施RecyclerView。每当我点击任何项目时,会触发OnClick事件,但会在多个项目上触发。但是应该为我拍过的物品开火。它也会被RecyclerView的随机行触发。例如,当我点击RecyclerView的第一行时,OnClick事件会在随机位置被触发,例如7日,15日,28日...... 112次。我认为它会被回收所以这种情况发生了。

起初它并没有因随机阵地被解雇。例如,如果点击第一个位置onclick事件在第一个位置以及第12个,第21个,第31个,即每个第12个位置被触发。它是周期性的,但现在只是随机的。

我尝试了很多方法,如:

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

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

我也尝试了很多其他方法,但很抱歉我无法提供链接,因为我需要超过10个声明,抱歉。

以下是我的观察员类:

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方法中使用位置提供吐司而不是扩展recyclelerview它完美地工作,它既不是随机位置也不是定期产生的。

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 个答案:

答案 0 :(得分:2)

将clickClickner放在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
            }
        });


}

答案 1 :(得分: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
  • 的活动/片段上实施此侦听器