0

I have build a list of data with a recyclerview. Everything works as expected. But I want to acces some data in my adapter when I click on a cell. The click works. But I don't know how to acces my events list.

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

    private final LayoutInflater layoutInflater;
    private final Context context;
    private ArrayList<Event> events;

    public ExampleAdapter(Context context, ArrayList<Event> events) {
        this.context = context;
        layoutInflater = LayoutInflater.from(context);
        this.events = events;
    }

    @Override
    public ExampleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(layoutInflater.inflate(R.layout.activity_row, parent, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //holder.textView.setText(titles[position]);

        holder.title.setText(events.get(position).getTitle());
        holder.time.setText(events.get(position).getTime());
        holder.places.setText(events.get(position).getPlacesLeft());

    }

    public void add(ArrayList<Event> events){
        this.events = events;
        this.notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return events == null ? 0 : events.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        TextView time;
        TextView places;

        ViewHolder(View view) {
            super(view);

            title = (TextView) view.findViewById(R.id.activity_title);
            time = (TextView) view.findViewById(R.id.activity_time);
            places = (TextView) view.findViewById(R.id.activity_places);



            //textView = (TextView) view.findViewById(R.id.text_view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("ViewHolder", "onClick--> position = " + getPosition());
                }
            });
        }
    }
}

I have declared the onclick listener in the ViewHolder class. The click listener works as expected. But I want to acces the data in my events array. The only problem is that I can't acces it.

da1lbi3
  • 4,369
  • 6
  • 31
  • 65

2 Answers2

1

your onclick should be inside your onBindViewHolder

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //holder.textView.setText(titles[position]);

        holder.title.setText(events.getTitle());
        holder.time.setText(events.getTime());
        holder.places.setText(events.getPlacesLeft());

            holder.yourview.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) 
                {
                    //access from here
            Toast.makeText(yourActivity.this,holder.yourview.getText().toString(), Toast.LENGTH_SHORT).show();

                }
            });

    }
0

If you just want to handle the click on the item you can do like this :

In your adapter write a function to get an event at a position :

public Event getEventAtPosition(int position) {
    if (events != null && events.size() > position)
       return events.get(position);
    else return null;
}

Then implement a RecyclerTouchListener :

public interface ClickListener{

     void onClick(View view,int position);
     void onLongClick(View view,int position);
}

class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{

    private ClickListener clicklistener;
    private GestureDetector gestureDetector;

    public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener){

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

            @Override
            public void onLongPress(MotionEvent e) {
                View child=recycleView.findChildViewUnder(e.getX(),e.getY());
                if(child!=null && clicklistener!=null){
                    clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View child=rv.findChildViewUnder(e.getX(),e.getY());
        if(child!=null && clicklistener!=null && gestureDetector.onTouchEvent(e)){
            clicklistener.onClick(child,rv.getChildAdapterPosition(child));
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

Finally, you can use it this way :

    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this,
            recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, final int position) {
            Event event= ((EventListAdapter)recyclerView.getAdapter()).getEventAtPosition(position);
        }

        @Override
        public void onLongClick(View view, int position) {
        }
    }));

This way, you have only 1 ClickListener for all your recycler view, this is more optimal than declaring a listener for each item.

For more informations about RecyclerView and onClick, check this topic : RecyclerView onClick

Mickael B.
  • 4,755
  • 4
  • 24
  • 48