I have my custom viewpager to achieve onItemClick so I took a reference from here. When I put that Viewpager inside Activity it is working fine but when I put inside a fragment then it stops fire onItemClick event.
I am using data binding for activity and fragment code. I guess proper touch event is not passing to the custom viewpager.
How can I achieve onItemClick on custom viewpager?
Please correct me if I am wrong anywhere.
Thanks in advance.
Custom Viewpager
public class ClickableViewPager extends ViewPager {
private OnViewPagerItemClickListener mOnItemClickListener;
private GestureDetector tapGestureDetector;
public ClickableViewPager(Context context) {
super(context);
setup();
}
public ClickableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setup();
}
private void setup() {
tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener());
this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
DebugHelper.log("ClickableViewPager : OnTouchListener");
tapGestureDetector.onTouchEvent(event);
return false;
}
});
}
public void setOnItemClickListener(OnViewPagerItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
public interface OnViewPagerItemClickListener {
void onViewPagerItemClick(int position);
}
private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
DebugHelper.log("ClickableViewPager : TapGestureListener : onSingleTapConfirmed");
if (mOnItemClickListener != null) {
mOnItemClickListener.onViewPagerItemClick(getCurrentItem());
}
return true;
}
}
}
View Pager Adapter
public class OnGoingServiceAdapter extends PagerAdapter {
private final LayoutInflater inflater;
private Activity activity;
private List<HistoryModel> onGoingServiceList;
private Interfaces.OnMoreServiceClick onMoreServiceClick;
public OnGoingServiceAdapter(Activity context, List<HistoryModel> onGoingServiceList, Interfaces.OnMoreServiceClick onMoreServiceClick) {
activity = context;
inflater = LayoutInflater.from(context);
this.onGoingServiceList = onGoingServiceList;
this.onMoreServiceClick = onMoreServiceClick;
}
@Override
public Object instantiateItem(ViewGroup collection, int position) {
OngoingServiceItemBinding binding = DataBindingUtil.inflate(inflater, R.layout.ongoing_service_item, collection, false);
binding.setOnGoingService(this.onGoingServiceList.get(position));
binding.ivCall.setTag(position);
binding.ivCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag();
StaticUtils.onPhoneClick(activity, getItem(position).getPhone());
}
});
binding.tvMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onMoreServiceClick != null) {
onMoreServiceClick.onMoreCurrentServiceItemClick();
}
}
});
collection.addView(binding.getRoot());
return binding.getRoot();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
((ViewPager) container).removeView(view);
view = null;
}
@Override
public int getCount() {
return this.onGoingServiceList == null ? 0 : this.onGoingServiceList.size(); //onGoingServiceList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
public HistoryModel getItem(int position) {
return this.onGoingServiceList.get(position);
}
public void updateData(List<HistoryModel> servicesList) {
this.onGoingServiceList = servicesList;
notifyDataSetChanged();
}
}