简体   繁体   中英

How to pass onClickHandler as parameter while setting adapter for a RecyclerView in a Fragment?

I made an Adapter for my recyclerView. This adapter works when I use on any xxxActivity.java but when I try to use is on a Fragment Its hows error. Doesn't let me Pass the onClickHandler() that I created in Adapter. I am Setting Adapter Like this -

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

Another try was like --

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

Here, I implemented getClickHandler() in the Fragment--

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

and the Adapter Part-- Constructor like this-

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

这是此图中显示的错误!

I tried to do this ... but still doesn't work--

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

here is my full adapter 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);
    }
}

}

Need Help!

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);
        }
    }

}

And In your activity

  1. implements NewsItemClickListener
  2. create object NewsItemClickListener newsItemClickListner;
  3. inside oncreate newsItemClickListner=this; (you mush have implemented 1)
  4. pass that object to recyclerview.

In adapter it is received by this public CategoryNewsListAdapter(List personList, Context mContext, NewsItemClickListener newsItemClickListener) { this.actors.addAll(personList); this.mContext = mContext; this.newsItemClickListener = newsItemClickListener; }

In your activity

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

After doing all this your overriden method will be called when you click in item of recycler view where you have set onclick listner

Okay .. The Problem is Fixed now ... I was passing the wrong value or maybe the method of passing the ClickHandler was wrong. The Solution of the Problem : I Created another Class for 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);
}

}

and the change in the Fragment was like this- (Just passed a object from the ClickHandler class)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM