0

J'ai fait un adaptateur pour mon recyclerView. Cet adaptateur fonctionne quand je l'utilise sur n'importe quel xxxActivity.java mais quand j'essaye d'employer est sur un fragment Son erreur de hows. Ne me laisse pas passer le onClickHandler() que j'ai créé dans Adapter. Je suis en train Adaptateur Comme cela -Comment passer onClickHandler comme paramètre lors de la définition de l'adaptateur pour un RecyclerView dans un fragment?

events_recyclerview.setAdapter(new FixedPlaceListAdapter(getContext(), placelist, mClickHandler)); //ClickListener doesn't work :'(

Un autre essai a été comme -

events_recyclerview.setAdapter(new FixedPlaceListAdapter(getContext(), placelist, getmClickHandler())); 

Ici, je getClickHandler mis en œuvre() dans le Fragment--

public FixedPlaceListAdapter.FixedPlaceListAdapterOnclickHandler getmClickHandler() { 
    return mClickHandler; 
} //Still doesn't work :'(

et l'adaptateur Pièce- Constructeur comme ceci-

public FixedPlaceListAdapter(Context mContext, List<PlaceBean> 
placeBeanList, FixedPlaceListAdapterOnclickHandler mClickHandler) { 
    this.mContext = mContext; 
    this.placeBeanList = placeBeanList; 
    this.mClickHandler = mClickHandler; 
} 

Here is the Error showing in this image!

J'ai essayé de le faire ... mais ne fonctionne toujours pas work--

events_recyclerview.setAdapter(new FixedPlaceListAdapter(getContext(), placelist, FixedPlaceListAdapter.FixedPlaceListAdapterOnclickHandler.mClickhandler)); 

ici est mon adaptateur complet code-

public class FixedPlaceListAdapter extends RecyclerView.Adapter<FixedPlaceListAdapter.FixedPlaceListAdapterViewHolder> { 

private final FixedPlaceListAdapterOnclickHandler mClickHandler; 
Context mContext; 
List<PlaceBean> placeBeanList; 

public FixedPlaceListAdapter(Context mContext, List<PlaceBean> placeBeanList, FixedPlaceListAdapterOnclickHandler mClickHandler) { 
    this.mContext = mContext; 
    this.placeBeanList = placeBeanList; 
    this.mClickHandler = mClickHandler; 
} 

public void setData(List<PlaceBean> placeBeanList) { 
    this.placeBeanList = placeBeanList; 
    notifyDataSetChanged(); 
} 

@Override 
public FixedPlaceListAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    View view = inflater.inflate(R.layout.top_list_single, parent, false); 
    return new FixedPlaceListAdapterViewHolder(view); 
} 

@Override 
public void onBindViewHolder(FixedPlaceListAdapterViewHolder holder, int position) { 
    PlaceBean pb = placeBeanList.get(position); 
    holder.nameTextView.setText(pb.getName()); 
    holder.addressTextView.setText(pb.getVicinity()); 
    holder.rating.setRating(pb.getRating()); 

    if (pb.getPhotoref() != null) { 
     String imageUrl = UrlsUtil.getSinglePhotoUrlString(mContext, pb.getPhotoref(), "350", "300"); 
     Picasso.with(mContext) 
       .load(imageUrl) 
       .into(holder.thumbnailImage); 
    } 
} 

@Override 
public int getItemCount() { 
    return placeBeanList.size(); 
} 

public interface FixedPlaceListAdapterOnclickHandler { 
    void onClick(String id); 
} 

public class FixedPlaceListAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView nameTextView; 
    TextView addressTextView; 
    RatingBar rating; 
    ImageView thumbnailImage; 

    public FixedPlaceListAdapterViewHolder(View itemView) { 
     super(itemView); 
     nameTextView = (TextView) itemView.findViewById(R.id.place_name_now_in_list); 
     addressTextView = (TextView) itemView.findViewById(R.id.address_in_list); 
     rating = (RatingBar) itemView.findViewById(R.id.rating_single_place_in_list); 
     thumbnailImage = (ImageView) itemView.findViewById(R.id.place_image_thumb); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     String placeID = placeBeanList.get(getAdapterPosition()).getPlaceref(); 
     mClickHandler.onClick(placeID); 
    } 
} 

}

Besoin d'aide pour!

+0

comment l'utilisez-vous dans d'autres classes? –

+0

après avoir créé et remplacé meythod de onClick() ... recyclerview.setAdapter (new FixedPlaceListAdapter (getContext(), placelist, this)); –

Répondre

0

Ok .. Le problème est Fixé maintenant ... Je passais la mauvaise valeur ou peut-être la méthode de passer le ClickHandler était erronée. La solution du problème: j'ai créé une autre classe pour ClickHandler-

public class PlaceCardClickHandler implements 
FixedPlaceListAdapter.FixedPlaceListAdapterOnclickHandler, 
    PlaceListAdapter.PlaceListAdapterOnclickHandler { 
Context mContext; 

public PlaceCardClickHandler(Context mContext) { 
    this.mContext = mContext; 
} 

@Override 
public void onClick(String id) { 
    Intent intentToStartDetail = new Intent(mContext, PlaceDetailActivity.class); 
    intentToStartDetail.putExtra("id", id); 
    mContext.startActivity(intentToStartDetail); 
} 

}

et le changement dans le fragment était comme this- (derrière un objet de la classe clickHandler)

events_recyclerview.setAdapter(new FixedPlaceListAdapter(getContext(), placelist, new PlaceCardClickHandler(getContext()))); 
0
public class CategoryNewsListAdapter extends RecyclerView.Adapter<CategoryNewsListAdapter.ViewHolder> { 

    private List<CategoryNews> actors = new ArrayList<>(); 
    private Context mContext; 

    private Queue<List<CategoryNews>> pendingUpdates = 
      new ArrayDeque<>(); 

    **public interface NewsItemClickListener { 
     void onNewsItemClick(int pos, CategoryNews categoryNews, ImageView shareImageView); 
    }** 

    **NewsItemClickListener newsItemClickListener;** 

    public CategoryNewsListAdapter(List<CategoryNews> personList, Context mContext, NewsItemClickListener newsItemClickListener) { 
     this.actors.addAll(personList); 
     this.mContext = mContext; 
     this.newsItemClickListener = newsItemClickListener; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     final View view = inflater.inflate(R.layout.particular_cat_news_list_row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Log.d("BusinessSubCategoryListAdapter", "Bindviewholder without payload"); 
     final CategoryNews newsCategory = actors.get(position); 
     holder.news_title.setText(newsCategory.getPostTitle()); 
     holder.news_date.setText(newsCategory.getPostDate()); 
     holder.news_category.setText(newsCategory.getCategoryName()); 
     holder.news_description.setText(newsCategory.getPostContent()); 
//  GlideApp 
//    .with(mContext).load(newsCategory.getPostImage()) 
//    .placeholder(R.mipmap.ic_launcher) // can also be a drawable 
//    .error(R.drawable.placeholder_image) // will be displayed if the image cannot be loaded 
//    .crossFade() 
//    .into(holder.news_image); 

     Picasso.with(mContext).load(newsCategory.getPostImage()).placeholder(R.drawable.placeholder_image).error(R.drawable.placeholder_image).into(holder.news_image); 
**holder.itemView.setOnClickListener(v -> { 
    newsItemClickListener.onNewsItemClick(position, newsCategory, holder.news_image); 
});** 

    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) { 

     if (payloads.isEmpty()) { 
      // if empty, do full binding; 
      onBindViewHolder(holder, position); 
      return; 
     } 
     Bundle bundle = (Bundle) payloads.get(0); 

     String newTitle = bundle.getString("NAME_CHANGE"); 
     if (newTitle != null) { 
      // add some animation if you want 
      final CategoryNews actor = actors.get(position); 
      holder.news_title.setText(actor.getPostTitle()); 
      holder.news_date.setText(actor.getPostDate()); 
      holder.news_category.setText(actor.getCategoryName()); 
      holder.news_description.setText(actor.getPostContent()); 
     } 
    } 

    public void addItems(List<CategoryNews> newItems) { 
     // record this value before making any changes to the existing list 
     int curSize = getItemCount(); 
     // update the existing list 
     actors.addAll(newItems); 
     // curSize should represent the first element that got added 
     // newItems.size() represents the itemCount 
     notifyItemRangeInserted(curSize, newItems.size()); 
    } 

    public void updtateItems(List<CategoryNews> newItems) { 
     // record this value before making any changes to the existing list 
     int curSize = getItemCount(); 
     // update the existing list 
     actors.addAll(newItems); 
     // curSize should represent the first element that got added 
     // newItems.size() represents the itemCount 
     notifyItemRangeInserted(0,newItems.size()- getItemCount()-1); 

    } 



    @Override 
    public int getItemCount() { 
     return actors.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     private TextView news_title, news_date, news_category, news_description; 

     private ImageView news_image; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      news_title = (TextView) itemView.findViewById(R.id.news_title); 
      news_date = (TextView) itemView.findViewById(R.id.news_date); 
      news_category = (TextView) itemView.findViewById(R.id.news_category); 
      news_description = (TextView) itemView.findViewById(R.id.news_description); 
      news_image = (ImageView) itemView.findViewById(R.id.news_image); 
     } 
    } 

} 

Dans votre activité

  1. implémente NewsItemClickListener
  2. créer un objet NewsItemClickListener newsItemClickListner;
  3. à l'intérieur oncreate newsItemClickListner = this; (vous avez mis en œuvre 1)
  4. passez cet objet à recyclerview.

adaptateur, il est reçu par ce CategoryNewsListAdapter publique (Liste PersonList, Contexte mContext, NewsItemClickListener newsItemClickListener) { this.actors.addAll (PersonList); this.mContext = mContext; this.newsItemClickListener = newsItemClickListener; }

Dans votre activité

CategoryNewsListAdapter categoryNewsListAdapter= new CategoryNewsListAdapter(list,this,newsItemClickListner) 

Après avoir fait tout cela votre méthode surchargée sera appelée lorsque vous cliquez au point de vue recycleur où vous avez défini onclick listner

+0

Avez-vous implémenté l'écouteur dans le fragment. –

+0

J'ai essayé de faire cette méthode .. aucune erreur dans mon code .. mais l'application se bloque lorsque je clique sur le composant:/ –

+0

J'ai implémenté onclickhandler ... comme je passe onclickhandler dans l'adpater:/ –