3

I have created a interface for extending functionality of Recycler View and making possible to listen click on every item of list, but i can't make it to work. Nothing happens when i click on any item. Here is my code:

// METHOD FOR INITIALIZATION OF RECYCLER VIEW
public void initRecyclerView() {
    // SETTING ARRAY FOR CATEGORIES
    final CategoryItem categoryItem[] = { new CategoryItem("Birthday", R.drawable.birthday_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image)};

    // FINDING RECYCLER VIEW IN LAYOUT
    recyclerView = (RecyclerView) findViewById(R.id.list);
    recyclerView.setLayoutManager(new GridLayoutManager(this, 2));

    adapter = new CategoriesListAdapter(categoryItem);
    recyclerView.setAdapter(adapter);

    // SETTING ON CLICK LISTENER ON ADAPTER
    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void setOnItemClick(View view, int position) {
            String clickedItem = String.valueOf(position);
            if ( clickedItem.equals("Birthday") ) {
                Toast.makeText(MainActivity.this, "Clicked on Birthday!", Toast.LENGTH_SHORT).show();
            }
        }
    });
    recyclerView.setItemAnimator(new DefaultItemAnimator());

}

UPDATE:

adapter

public class CategoriesListAdapter extends RecyclerView.Adapter<CategoriesListAdapter.ViewHolder> {

private CategoryItem[] categoryItems;
private static OnItemClickListener onItemClickListener;

public CategoriesListAdapter(CategoryItem[] categoryItems) {
    this.categoryItems = categoryItems;
}

@Override
public CategoriesListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}


@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    viewHolder.txtViewTitle.setText(categoryItems[position].getTitle());
    viewHolder.imgViewIcon.setImageResource(categoryItems[position].getImage());

}

// inner class to hold a reference to each item of RecyclerView
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.image);
        itemLayoutView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onItemClickListener.setOnItemClick(v, getAdapterPosition());
    }
}

public void setOnItemClickListener (final OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

// Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
    return categoryItems.length;
}

}

INTERFACE:

public interface OnItemClickListener {

public void setOnItemClick(View view, int position);

}

It should display toast message if birthday is selected, but it's not displaying anything. I'm instancing array of class and i don't know how to listen clicked item. The answers there didn't help me solving my problem.

Dusan Dimitrijevic
  • 3,169
  • 6
  • 22
  • 46
  • 2
    Possible duplicate of [RecyclerView onClick](http://stackoverflow.com/questions/24471109/recyclerview-onclick) – Shai Jan 04 '16 at 12:56

2 Answers2

2

Currently you are checking your position against string "Birthday" in OnItemClickListener method setOnItemClick

String clickedItem = String.valueOf(position);
if ( clickedItem.equals("Birthday") ) {
    ...
}

which never gonna be true. Try getting item for position and checking its first parameter against "Birthday" or bring your Toast out from that if statement and just print out position number for beginning to understand what's going on in there

@Override
public void setOnItemClick(View view, int position) {
    Toast.makeText(MainActivity.this, "Clicked item on position: " + position, Toast.LENGTH_SHORT).show();
}
priitv
  • 71
  • 2
  • That is working, but how will i start new specified activity for each item clicked? – Dusan Dimitrijevic Jan 04 '16 at 13:42
  • In ViewHolder OnClick method you could return onItemClickListener.setOnItemClick(v, categoryItems[getAdapterPosition()]) instead of just position number and use that object to add some extras while starting new activity(of course you need edit your interface a little because of that and other places accordingly). How to start activity.. you can get one example from http://stackoverflow.com/questions/4186021/how-to-start-new-activity-on-button-click – priitv Jan 04 '16 at 13:54
  • I have tried changing second argument of setOnItemClick() method in interface with class CategoryItem and pass it in adapter in setOnItemClick() method, but didn't work – Dusan Dimitrijevic Jan 04 '16 at 14:11
  • Did you end up with something like in MainActivity you got callback `setOnItemClick(View view, CategoryItem item)` (from where you should have been able to get the title of the item and maybe for testing purpose display it with Toast) and from adapter in onClick method you called `onItemClickListener.setOnItemClick(v, categoryItems [getAdapterPosition()]);`? Did it throw some sort of an exception or what happened? – priitv Jan 04 '16 at 15:50
  • I have tried to check if item, instance of class CategoryItem is equal to the title and nothing happens. I tested that in toast message. – Dusan Dimitrijevic Jan 04 '16 at 16:20
  • Did you try if the title inside CategoryItem is equal to "Birthday", not the CategoryItem itself(something like "Birthday".equals(item.yourMethodToGetTitle())? For first just try to print out item title, don't start from checking if it equals: `Toast.makeText(MainActivity.this, "Clicked on: " + item.yourMethodToGetTitle(), Toast.LENGTH_SHORT).show()` – priitv Jan 04 '16 at 17:27
0

My Solution: Steps Involved

  1. Created an interface RecyclerviewClickListener
  2. Implemented interface on an activity/fragment
  3. Passed the interface to the adapter
  4. Called an interface method on an item clicked onBindViewHolder.

RecyclerviewClickListener interface

   //Created an interface RecyclerviewClickListener
    public interface RecyclerviewClickListener
    {
        void recyclerviewClickListener(int position);
    }

NewFragment

//Implemented interface on an activity/fragment
public class NewFragment extends Fragment implements RecyclerviewClickListener
{
   //Passed the interface to the adapter
   adapter = new Adapter(getContext(), dataList, this);

    @Override
    public void recyclerviewClickListener(int position)
    {
      //Do something here with the position from a recyclerview
      //e.g dataList.get(position);
    }
}

Adapter

public class UniversityAdapter extends RecyclerView.Adapter<UniversityAdapter.ViewHolder>
{
    private final ArrayList<User> dataList;
    private final Context context;
    private  RecyclerviewClickListener listener;

    public Adapter(Context context, ArrayList<User> dataList, RecyclerviewClickListener itemListener)
    {
        context = context;
        dataList = universityArrayList;
        listener = itemListener;
    }
    
        @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position)
    {
       holder.userName.setOnclickListener(view -> listener.recyclerviewClickListener(position));

    }
}
4xMafole
  • 479
  • 1
  • 8
  • 20