If I click on RecyclerView
item I should get toast category id.
I've tried many times but I was not able to get a toast.
I'm using api. If I get this toast it will be very simple for me to see id.
Toast.makeText(v.getContext(), "Item is clicked", Toast.LENGTH_SHORT).show();
I don't get id from these I'm new Android Developer
adapterRecipes.setOnItemClickListener((v, obj, position) -> {
Intent intent = new Intent(getApplicationContext(), ActivityRecipeDetail.class);
intent.putExtra(Constant.EXTRA_OBJC, obj);
Toast.makeText(v.getContext(), "Item is clicked", Toast.LENGTH_SHORT).show();
startActivity(intent);
adsManager.showInterstitialAd();
});
adapter
package com.app.yourrecipesapp.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.app.yourrecipesapp.R;
import com.app.yourrecipesapp.config.AppConfig;
import com.app.yourrecipesapp.databases.prefs.SharedPref;
import com.app.yourrecipesapp.models.Category;
import com.balysv.materialripple.MaterialRippleLayout;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
public class AdapterCategory extends RecyclerView.Adapter<AdapterCategory.ViewHolder> {
private List<Category> items;
private Context context;
private OnItemClickListener mOnItemClickListener;
SharedPref sharedPref;
public interface OnItemClickListener {
void onItemClick(View view, Category obj, int position);
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mOnItemClickListener = mItemClickListener;
}
// Provide a suitable constructor (depends on the kind of dataset)
public AdapterCategory(Context context, List<Category> items) {
this.items = items;
this.context = context;
this.sharedPref = new SharedPref(context);
}
public class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView category_name;
public TextView recipe_count;
public ImageView category_image;
public MaterialRippleLayout lyt_parent;
public ViewHolder(View v) {
super(v);
category_name = v.findViewById(R.id.category_name);
recipe_count = v.findViewById(R.id.video_count);
category_image = v.findViewById(R.id.category_image);
lyt_parent = v.findViewById(R.id.lyt_parent);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_category, parent, false);
return new ViewHolder(v);
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final Category c = items.get(position);
holder.category_name.setText(c.category_name);
if (AppConfig.ENABLE_RECIPE_COUNT_ON_CATEGORY) {
holder.recipe_count.setVisibility(View.VISIBLE);
holder.recipe_count.setText(c.recipes_count + " " + context.getResources().getString(R.string.recipes_count_text));
} else {
holder.recipe_count.setVisibility(View.GONE);
}
Picasso.get()
.load(sharedPref.getApiUrl() + "/upload/category/" + c.category_image)
.placeholder(R.drawable.ic_thumbnail)
.into(holder.category_image);
holder.lyt_parent.setOnClickListener(view -> {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view, c, position);
}
});
}
public void setListData(List<Category> items){
this.items = items;
notifyDataSetChanged();
}
public void resetListData() {
this.items = new ArrayList<>();
notifyDataSetChanged();
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return items.size();
}
}
category.java
package com.app.yourrecipesapp.models;
import java.io.Serializable;
public class Category implements Serializable {
public int cid = -1;
public String category_name;
public String category_image;
public String recipes_count;
}
According to this question this is the best way to implement clicking on the item of RecyclerView
Firstly create a file values/ids.xml
and put this in it:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="item_click_support" type="id" />
</resources>
then add the code below to your source
Copy the following helper class to your project
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) {
// ask the RecyclerView for the viewHolder of this view.
// then use it to get the position for the adapter
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) {
// every time a new child view is attached add click listeners to it
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
}
};
private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
// the ID must be declared in XML, used to avoid
// replacing the ItemClickSupport without removing
// the old one from the RecyclerView
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}
public static ItemClickSupport addTo(RecyclerView view) {
// if there's already an ItemClickSupport attached
// to this RecyclerView do not replace it, use it
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);
}
}
just call it from activity / fragment like the following
ItemClickSupport.addTo(mRecyclerView)
.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// do it
Toast.makeText(v.getContext(), "Item is clicked", Toast.LENGTH_SHORT).show();
}
});
(it also supports long item click)