Sagar Chavada
Sagar Chavada

Reputation: 5269

recyclerview click event not working in alert dialog

I am using custom dialog view with recyclerview, and i successfully get data in my recyclerview, but when i m setup click listener to my recyclerview, its not working.

@Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            pDialog.dismiss();
            final AlertDialog.Builder builderSingle = new AlertDialog.Builder(mContext);
            final AlertDialog OptionDialog = builderSingle.create();
            builderSingle.setTitle("Select Card");

            View view = ((Activity)mContext).getLayoutInflater().inflate(R.layout.activity_payment, null);

            RecyclerView list1 = (RecyclerView) view.findViewById(R.id.recyclerview);
            final LinearLayoutManager mLayoutManager;
            mLayoutManager = new LinearLayoutManager(mContext);
            list1.setLayoutManager(mLayoutManager);
            list1.setItemAnimator(new DefaultItemAnimator());
            AdapterDialogCard adapter = new AdapterDialogCard(mContext, list);
            list1.setAdapter(adapter);


            list1.addOnItemTouchListener(new RecyclerTouchListener(mContext, list1, new RecyclerTouchListener.ClickListener() {
                @Override
                public void onClick(View view, int position) {
                    CreditCard item = list.get(position);
                    cardid      = item.getId();
                    OptionDialog.dismiss();
                }

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

                }
            }));

            builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            builderSingle.setView(view);
            builderSingle.show();
        }
    }

and this is what i got as a result.

enter image description here

so my question is how to set click listener in alert dialog.

Upvotes: 1

Views: 2441

Answers (4)

Sagar Chavada
Sagar Chavada

Reputation: 5269

Sorry guys. its a silly mistake, but i finally solved it. i just compare my ItemTouchListener with @Newbie android answer. and i found that in my class i m using deperecated method for getting position of view.

@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.getChildPosition(child));
            }
            return false;
        }

here my rv.getChildPostion() is deprecated, so i just change it to rv.getChildAdapterPosition() and miracle happen. i never thought that this can trouble in dialog.

Upvotes: 0

Sahil Munjal
Sahil Munjal

Reputation: 483

Create a Interface -

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

Pass the object of that interface to the constructor of adapter class:

AdapterDialogCard adapter = new AdapterDialogCard(mContext, list, new AdapterClickListener() {
        @Override
        public void onClick(final int position, View view) {
           //Your code
        }
    });

Now, In Adapter Class Constructor :

public AdapterClass(Your Other objects, AdapterClickListener adapterClickListener){
      this.adapterClickListener = adapterClickListener;
      //Other Code
}

Now, In adapter class implement the click listener in holder :

itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (adapterClickListener != null) {
                        adapterClickListener.onClick(getAdapterPosition(), v);
                    }
                }
            });

Upvotes: 0

Newbie Android
Newbie Android

Reputation: 389

You need to extend ItemTouchListener

 public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

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

private GestureDetector mGestureDetector;

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

@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.getChildAdapterPosition(childView));
    }
    return false;
}

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

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}
 }

and to call this class use this code

 rv.addOnItemTouchListener(
            new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {

                    dialog.dismiss();
                }
            })
    );

Upvotes: 1

MdFazlaRabbiOpu
MdFazlaRabbiOpu

Reputation: 174

You are using RecycleView means you are also using RecycleAdapter. It will work if you add your listener inside Adapter's onBindViewHolder like below:

@Override 
  public void onBindViewHolder(final ViewHolder holder, int position) {
    CreditCard item = list.get(position);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           ///do your code here//
        }
    });
}

Please let me know the if it works or not.

Upvotes: 0

Related Questions