Подтвердить что ты не робот

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

4b9b3361

Ответ 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

Надеюсь, поможет.