我正在构建一个使用RecyclerView和CardView的应用程序。由于RecyclerView没有onItemClickListener方法,我找到了一个这样做的类实现,并且能够将此类插入到我的项目中。将RecyclerView放在图像前
在每张卡片中,我将一个imageView(我正在使用Glide加载图像)和一对TextViews。当TextView低于图像时,我可以完美地使用onItemClickListener,但我决定将图像放在背景为黑色透明的RelativeLayout中。
问题是,在此更改后onItemClickListener停止工作。图像占据整个cardView并且TextView位于其前面。通过点击这些元素中的任何一个,该方法都不起作用。我认为我需要将recyclerView放在活动的前面,但我不知道如何去做。我试图使用recyclerView.bringToFront(),但它不起作用。
这是(在白色区域点击时,点击监听器工作)前,把卡:
这是卡现在(当我点击任何地方点击监听器不工作):
这是我ItemClickSupport类:
public class ItemClickSupport {
private final RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
}
};
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
return false;
}
};
private RecyclerView.OnChildAttachStateChangeListener mAttachListener
= new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
}
};
private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}
public static ItemClickSupport addTo(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support == null) {
support = new ItemClickSupport(view);
}
return support;
}
public static ItemClickSupport removeFrom(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support != null) {
support.detach(view);
}
return support;
}
public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
return this;
}
public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener = listener;
return this;
}
private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(R.id.item_click_support, null);
}
public interface OnItemClickListener {
void onItemClicked(RecyclerView recyclerView, int position, View v);
}
public interface OnItemLongClickListener {
boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
}
}
这是我从我的活动称之为:
ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
Intent intent = new Intent(getBaseContext(), MovieDetails.class);
intent.putExtra("movie_name", movies.get(position).getTitle());
intent.putExtra("movie_rating", movies.get(position).getVoteAverage().toString());
intent.putExtra("movie_description", movies.get(position).getOverview());
intent.putExtra("movie_cover", movies.get(position).getPosterPath());
intent.putExtra("movie_date", movies.get(position).getReleaseDate());
intent.putExtra("movie_language", movies.get(position).getOriginalLanguage());
intent.putExtra("movie_backdrop", movies.get(position).getBackdropPath());
//intent.putExtra("album_name", albumList.get(position).getName());
//intent.putExtra("album_thumbnail", Integer.toString(albumList.get(position).getThumbnail()));
//intent.putExtra("number_songs", Integer.toString(albumList.get(position).getNumOfSongs()));
startActivity(intent);
}
});
这是我的适配器:
public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {
private Context mContext;
private List<MovieItem> movieList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, count;
public ImageView thumbnail, overflow, star1, star2, star3, star4, star5;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
count = (TextView) view.findViewById(R.id.count);
thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
star1 = (ImageView) view.findViewById(R.id.rating_image1);
star2 = (ImageView) view.findViewById(R.id.rating_image2);
star3 = (ImageView) view.findViewById(R.id.rating_image3);
star4 = (ImageView) view.findViewById(R.id.rating_image4);
star5 = (ImageView) view.findViewById(R.id.rating_image5);
//overflow = (ImageView) view.findViewById(R.id.overflow);
}
}
public MoviesAdapter(Context mContext, List<MovieItem> movieList) {
this.mContext = mContext;
this.movieList = movieList;
}
@Override
public MoviesAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.album_card, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MoviesAdapter.MyViewHolder holder, int position) {
MovieItem movie = movieList.get(position);
holder.title.setText(movie.getTitle());
holder.count.setText("R: " + movie.getVoteAverage().toString() + "/10");
Glide.with(mContext).load("https://image.tmdb.org/t/p/w500" + movie.getPosterPath()).into(holder.thumbnail);
}
@Override
public int getItemCount() {
return movieList.size();
}
}
尝试onItemClickListener,它会在你点击cardview不论TextView的或imageview的我希望它会帮助你可以分享你的适配器代码工作。 。 – Sahil
? –
感谢您的答复!我只是将我的适配器添加到代码中。 –