Reputation: 5269
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.
so my question is how to set click listener in alert dialog.
Upvotes: 1
Views: 2441
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
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
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
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