-1

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

enter image description here

Und das ist die Karte nun (der Klick Hörer funktioniert nicht, wenn ich auf eine beliebige Stelle):

enter image description here

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

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

+0

können Sie Ihren Adapter Code teilen? –

+0

Danke für die Antwort! I habe gerade meinen Adapter zum Code hinzugefügt. –

Antwort

0

ich es geschafft, mein Problem zu lösen, indem sie das tun, was Sahil schlug mich. Ich habe den onClickListener auf das Bild anstatt auf die Recycleransicht gesetzt. Um dies zu tun, musste ich den Code in meinen Adapter in der onBindViewHolder-Methode einfügen (ich wusste nicht, dass ich das tun könnte).

Es war so etwas wie diese:. (ich hatte die Variable int Position als endgültig, um zu erklären, es in den OnClickListener zuzugreifen und die Flagge Intent.FLAG_ACTIVITY_NEW_TASK zu setzen, weil ich von außerhalb einer Aktivität eines weitere Aktion gestartet wurde

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 

holder.thumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(mContext, MovieDetails.class); 
       intent.putExtra("movie_name", movieList.get(position).getTitle()); 
       intent.putExtra("movie_rating", movieList.get(position).getVoteAverage().toString()); 
       intent.putExtra("movie_description", movieList.get(position).getOverview()); 
       intent.putExtra("movie_cover", movieList.get(position).getPosterPath()); 
       intent.putExtra("movie_date", movieList.get(position).getReleaseDate()); 
       intent.putExtra("movie_language", movieList.get(position).getOriginalLanguage()); 
       intent.putExtra("movie_backdrop", movieList.get(position).getBackdropPath()); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       //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())); 

       mContext.startActivity(intent); 
      } 
     }); 
} 
Verwandte Themen