简体   繁体   中英

setOnClickListener in RecyclerView

I'm trying to set OnClickListener for ImageButtons and Buttons for all views that will add in RecyclerView.

i dont know how to do it... I'm trying to set it in ViewHolder in Adapter Like this:

public Todo_itemViewHolder(View itemView) {
        super(itemView);
        Title=itemView.findViewById(R.id.todo_txt_Titleitem);
        Content=itemView.findViewById(R.id.todo_txt_Contentitem);
        edit=itemView.findViewById(R.id.todo_btn_edit);
        remove=itemView.findViewById(R.id.todo_btn_remove);
        Add=itemView.findViewById(R.id.todo_btn_add);

        Add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Todo_Adapter.this, Todo_saveActivity.class);
                startActivityForResult(intent,Request_Code);
            }
        });

Thanks.

The first you interfac like:

   public interface OnItemClickListener {
    void onItemClick(ContentItem item);
}

After in Adpter:

private final List<ContentItem> items;
private final OnItemClickListener listener;

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
    this.items = items;
    this.listener = listener;
}

And implement it:

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

    public interface OnItemClickListener {
        void onItemClick(ContentItem item);
    }

    private final List<ContentItem> items;
    private final OnItemClickListener listener;

    public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
        this.items = items;
        this.listener = listener;
    }

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

    @Override public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(items.get(position), listener);
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView name;
        private ImageView image;

        public ViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            image = (ImageView) itemView.findViewById(R.id.image);
        }

        public void bind(final ContentItem item, final OnItemClickListener listener) {
            name.setText(item.name);
            Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    listener.onItemClick(item);
                }
            });
        }
    }
}

In Activity or Fragment:

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
    @Override public void onItemClick(ContentItem item) {
        Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
        Intent intent=new Intent(SomeActivity.this, Todo_saveActivity.class);
            startActivityForResult(intent,Request_Code);
    }
}));

You can't start activity with adapter reference ,you have to start with activity/context , like this,

Intent intent=new Intent(MyActivity.this/myContext,Your2ndActivity.class);
startActivity(intent)

pass the context in yur adapter as an argument of the constructor ,or use the context from view.

contxt=v.getContext();
public class Todo_itemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public Todo_itemViewHolder(View itemView) {
            super(itemView);
            Title = itemView.findViewById(R.id.todo_txt_Titleitem);
            Content = itemView.findViewById(R.id.todo_txt_Contentitem);
            edit = itemView.findViewById(R.id.todo_btn_edit);
            remove = itemView.findViewById(R.id.todo_btn_remove);
            Add = itemView.findViewById(R.id.todo_btn_add);

            Add.setOnClickListener(this);
            remove.setOnClickListener(this);
            ... //declare listeners for other views
        }

        @Override
        public void onClick(View view) {
            switch (view.getId()) {

                case R.id.todo_btn_add: {  //add button click
                    Intent intent = new Intent(Todo_Adapter.this, Todo_saveActivity.class);
                    startActivityForResult(intent, Request_Code);
                }

                case R.id.todo_btn_remove: {  // remove button click
                }

                ... // add other listener events
            }
        }
    }

This way, you can add click listeners to all necessary views with minimal code, and give code to each click event easily. (well, not as easy as using some library like ButterKnife in the first place for doing this!)

public static class Todo_itemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    Title=itemView.findViewById(R.id.todo_txt_Titleitem);
    Content=itemView.findViewById(R.id.todo_txt_Contentitem);
    edit=itemView.findViewById(R.id.todo_btn_edit);
    remove=itemView.findViewById(R.id.todo_btn_remove);
    Add=itemView.findViewById(R.id.todo_btn_add);


      private Todo_itemViewHolder (View itemView) {
            super(itemView);
            add.setOnClickListener(this);

      }

      @Override
      public void onClick(View view) {
            Intent intent=new Intent(context, Todo_saveActivity.class);
            startActivityForResult(intent,Request_Code);
      }
  }

firstly, define a class implements RecyclerView.OnItemTouchListener;

public class ItemListeners implements RecyclerView.OnItemTouchListener {

public interface  OnItemClickListeners {
    void onClick(View view, int postion);
}

private GestureDetector  gestureDetector;
private OnItemClickListeners onItemTouchListener;

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

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

then at the fragment or activity,

 recyclderView.addOnItemTouchListener(new ItemListeners(getBaseContext(), 
    new ItemListeners.OnItemClickListeners() {
        @Override
        public void onClick(View view, int postion) {
            if (petLists.size() > 0){
                Intent intent = new Intent(getBaseContext(), 
                 SomeActivity.class);               
               if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivity(intent);

                }
            }

        }
    }));

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