-1

Error on android recyclerView Adapter. App will stop working while click on RecyclerView items. I want to go other activity when click any items, when i'm using Toast it working fine but if i add Intent then it stop working.

Here is my Interface :

public interface OnItemClickListener {
        void onClick(View view, int position);
}

here is my recycler Adapter calss :

public class RecAdapter extends RecyclerView.Adapter<RecAdapter.MyViewHolder> {

    private List<Items> items;
    private Context context;

    public RecAdapter(List<Items> items, Context context )
    {
        this.items = items;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item,parent,false);

        return new MyViewHolder(view);
    }

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

        holder.countryname.setText(items.get(position).getCountryname());
        holder.rank.setText(items.get(position).getRank());
        Picasso.with(context)
                .load(items.get(position).getFlag())
                .into(holder.flag);
        holder.setClickListener(new OnItemClickListener() {
            @Override
            public void onClick(View view, int position) {
                Intent intent = new Intent(context , Main2Activity.class);
                context.startActivity(intent);
            }
        });
    }

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

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

        TextView countryname, rank;
        ImageView flag;
        private OnItemClickListener clickListener;

        public MyViewHolder(View itemView) {
            super(itemView);
            countryname = (TextView) itemView.findViewById(R.id.capital);
            rank = (TextView) itemView.findViewById(R.id.rank);
            flag = (ImageView) itemView.findViewById(R.id.flag);
            itemView.setTag(itemView);
            itemView.setOnClickListener(this);

        }
        public void setClickListener(OnItemClickListener itemClickListener) {
            this.clickListener = itemClickListener;
        }
            @Override
        public void onClick(View view) {
            if (clickListener != null) clickListener.onClick(view, getAdapterPosition());
        }    
    }
}
Saveen
  • 3,742
  • 14
  • 32
  • 38
Khushbu
  • 3
  • 4

5 Answers5

0

You can not click an holder directly..... give a id to the view then re write the code as below:

holder.(someitem).setClickListener(new OnItemClickListener() {//you need a view to execute the onclicklistener
            @Override
            public void onClick(View view, int position) {
                Intent intent = new Intent(context , Main2Activity.class);
                context.startActivity(intent);
            }
        });
0

copying an answer of mine from a different question:

as you already know this method is no longer available in the RecyclerView class.

My approach towards implementing onClick events in a RecyclerView is something like this:

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    interface OnClickListener {
        void onClick(Item item);
    }

    private final List<Item> dataset;
    private final OnClickListener l; 

    public MyAdapter(List<Item> data, OnClickListener listener) {
        this.dataset = data;
        this.l = listener;
    }

    @Override MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = //inflate layout
        MyClick click = new MyClick() {
            onClick(int position) {
                if (l != null) {
                    l.onClick(dataset.get(position));
                }
            }
        };
        return new MyViewHolder(click, v);
    }

    static class MyViewHolder {
        final MyClick l;

        public MyViewHolder(MyClick listener, View view) {
            super(view);
            l = listener;
            // inflate views
            view.setOnClickListener(new OnClickListener() {
                if (l != null) {
                    l.onClick(getAdapterPosition());
                }
            });
        }

        interface MyClick {
            void onClick(int position);
        }
    }
}

class MyActivity extends AppCompatActivity {

    @Override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set layout
        MyAdapter adapter = new MyAdapter(getData(), new OnClickListener() {
            @Override onClick(Item item) {
                // do stuff with item
            }
        });
    }
}
thepoosh
  • 12,193
  • 14
  • 68
  • 129
0

Add click listener like this:-

View itemView;
Context context;


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);
    this.context=parent.getContext();
    return new ViewHolder(itemView);
}
@Override
    public void onBindViewHolder(final ViewHolder holder, int position) {

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context , Main2Activity.class);
                context.startActivity(intent);
            }
        });
    }
Nainal
  • 1,618
  • 11
  • 23
0

Here is code which i create click listener for Recycler Item Click

Using this you will get two types of click

  1. Simple Item click.
  2. Item Long click.

Here is RecyclerItemClickListener.java File

public class RecyclerItemClickListener  implements RecyclerView.OnItemTouchListener {
public interface OnItemClickListener
{
    void onItemClick(View view, int position);
    void onItemLongClick(View view, int position);
}

private OnItemClickListener mListener;
private GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener)
{
    mListener = listener;

    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()
    {
        @Override
        public boolean onSingleTapUp(MotionEvent e)
        {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e)
        {
            View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());

            if(childView != null && mListener != null)
            {
                mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView));
            }
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e)
{
    View childView = view.findChildViewUnder(e.getX(), e.getY());

    if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e))
    {
        mListener.onItemClick(childView, view.getChildPosition(childView));
    }

    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent){}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

}

How to use in Activity and Fragment

  rvcyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, rvcyclerView,
                new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        //do you what you want tot do simple click
                    }

                    @Override
                    public void onItemLongClick(View view, int position) {
                        //do you what you want tot do on long click
                    }
                }));
Arbaz.in
  • 1,164
  • 1
  • 14
  • 33
0
public class RecAdapter extends RecyclerView.Adapter<RecAdapter.MyViewHolder> implements View.OnClickListener {

    private List<Items> items;
    private Context context;
    private OnItemClickListener clickListener;

    public RecAdapter(List<Items> items, Context context )
    {
        this.items = items;
        this.context = context;
    }

    public void setClickListener(OnItemClickListener itemClickListener) {
        this.clickListener = itemClickListener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item,parent,false);

        return new MyViewHolder(view);
    }

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

        holder.countryname.setText(items.get(position).getCountryname());
        holder.rank.setText(items.get(position).getRank());
        Picasso.with(context)
                .load(items.get(position).getFlag())
                .into(holder.flag);
        holder.flag.setOnClickListener(this);
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView countryname, rank;
        ImageView flag;

        public MyViewHolder(View itemView) {
            super(itemView);
            countryname = (TextView) itemView.findViewById(R.id.capital);
            rank = (TextView) itemView.findViewById(R.id.rank);
            flag = (ImageView) itemView.findViewById(R.id.flag);

        }

            @Override
        public void onClick(View view) {
            if (clickListener != null) clickListener.onClick(view, getAdapterPosition());
        }    
    }
}

On Your Activity / Fragment Implement OnItemClickListener

    public class MainActivity extends AppCompatActivity implements OnItemClickListener{
    @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            LinearLayoutManager layout = new 
            LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL, false);
            mRecyclerView.setLayoutManager(layout );
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
            RecAdapter adapter = new RecAdapter(items ,getContext());
            adapter.setClickListener(this);
            mRecyclerView.setAdapter(adapter );
        }

     @Override
        public void onClick(View view, int position) {
       switch(view.getId()) {
       }
 }

}

Athar Iqbal
  • 350
  • 2
  • 12