我想在我的歌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();
}
}
如果我在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();
}
});
答案 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
。