Ich baue eine App, die RecyclerView und CardView verwendet. Da RecyclerView keine onItemClickListener-Methode hat, habe ich eine Klassenimplementierung gefunden, die dies tut und diese Klasse in mein Projekt einfügen konnte.Put RecyclerView vor Bild
In jeder Karte setze ich ein imageView (ich verwende Glide um Bilder zu laden) und ein paar TextViews. Wenn der TextView unter dem Bild war, konnte ich den OnItemClickListener Perfectly verwenden, aber ich entschied mich, den Text vor das Bild innerhalb eines RelativeLayout mit einem schwarzen transparenten Hintergrund zu setzen.
Das Problem ist, dass nach dieser Änderung der onItemClickListener nicht mehr funktioniert. Die Bilder belegen die gesamte cardView und die TextView befindet sich davor. Durch Klicken auf eines dieser Elemente funktioniert die Methode nicht. Ich denke, dass ich den RecyclerView an die Front der Aktivität bringen muss, aber ich weiß nicht, wie man das macht. Ich habe versucht, recyclerView.bringToFront() zu verwenden, aber es hat nicht funktioniert.
Dies ist die Karte vor (der Klick-Listener arbeitete, als auf dem weißen Bereich klicken):
Und das ist die Karte nun (der Klick Hörer funktioniert nicht, wenn ich auf eine beliebige Stelle):
Das ist mein ItemClickSupport Klasse ist:
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);
}
}
Und das ist mir aus meiner Tätigkeit Aufruf:
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);
}
});
Das ist mein Adapter:
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();
}
}
try onItemClickListener auf cardView statt Recycler Ansicht. es wird funktionieren, wenn Sie auf cardview klicken unabhängig von Textview oder Imageview. ich hoffe, es hilft. – Sahil
können Sie Ihren Adapter Code teilen? –
Danke für die Antwort! I habe gerade meinen Adapter zum Code hinzugefügt. –