ViewPager OnItemClickListener
Я новичок в Viewpager, и после чтения http://developer.android.com/reference/android/support/v4/view/ViewPager.html из Google я не могу найти ничего связанного с viewPager.setOnItemClickListener(new OnItemClickListener() {
У нас есть другие варианты действий как элемент, нажатый?
Тестирование
viewPager.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent i = new Intent(MainActivity.this, SingleItemView.class);
i.putExtra("flag", flag);
i.putExtra("position", position);
startActivity(i);
}
});
Ошибка:
Метод setOnItemClickListener (новый AdapterView.OnItemClickListener() {}) является undefined для типа ViewPager
Ответы
Ответ 1
Не существует метода обратного вызова OnItemClick для ViewPager. Если вы хотите, чтобы события нажимали на каждую страницу, вам нужно создать своего слушателя в содержимом страницы в вашем адаптере.
что-то вроде этого:
@Override
public Object instantiateItem(View collection, final int pos) { //have to make final so we can see it inside of onClick()
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View page = inflater.inflate(R.layout.YOUR_PAGE, null);
page.setOnClickListener(new OnClickListener(){
public void onClick(View v){
//this will log the page number that was click
Log.i("TAG", "This page was clicked: " + pos);
}
});
((ViewPager) collection).addView(page, 0);
return page;
}
то, что вам нужно, будет зависеть от того, что еще вы делаете внутри instantiateItem()
, которое вы не разместили, поэтому я не могу дать вам более конкретного ответа.
Ответ 2
Я внедрил пользовательский ViewPager
:
public class ClickableViewPager extends ViewPager {
private OnItemClickListener mOnItemClickListener;
public ClickableViewPager(Context context) {
super(context);
setup();
}
public ClickableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setup();
}
private void setup() {
final GestureDetector tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
tapGestureDetector.onTouchEvent(event);
return false;
}
});
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if(mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(getCurrentItem());
}
return true;
}
}
}
И код для реализации onItemClickListener
ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager);
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// your code
}
});
Ответ 3
Я не уверен, что вы ожидаете от вас ответить на вышеупомянутый слушатель.
Существует setOnClickListener(View.OnClickListener l)
, который вы можете использовать для обнаружения касания к viewPager.
Вы также можете использовать onPageScrolled
, чтобы получить пользовательский ввод, и onPageSelected
и onTabSelected
.
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
Ответ 4
в вашей деятельности; вы можете переопределить:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getY();
break;
case MotionEvent.ACTION_UP:
mDownX -= ev.getX();
mDownY -= ev.getY();
if(mDownX==0 && mDownY==0)
{
your action if click
}
break;
}
return super.dispatchTouchEvent(ev);
}
Ответ 5
Используйте EventBus.
Я только столкнулся с этой проблемой с помощью простого решения, просто установив OnClickListener на адаптер, а затем отправив событие.
public Object instantiateItem(@NonNull ViewGroup container, int position) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.category_item_layout, container, false);
ImageButton itemButton = view.findViewById(R.id.CategoryItem_ib_icon);
itemButton.setOnClickListener(view1 -> EventBus.getDefault().postSticky(new Event(Constants.onViewPagerItem, position)));
container.addView(view);
return view;
}
Конструктор:
public Event(int code, int viewPagerPosition) {
this.code = code;
this.viewPagerPosition = viewPagerPosition;
}
Зарегистрируйте мероприятие, где вы хотите получить событие:
EventBus.getDefault().register(this);
Позже просто получите событие с:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Event event) {
if (event.getCode() == Constants.onViewPagerItem) {
Toast.makeText(getContext(), "Item " + event.getViewPagerPosition(), Toast.LENGTH_SHORT).show();
}
}
Проверьте это, если вы не знаете: https://github.com/greenrobot/EventBus
Надеюсь, поможет.