web-dev-qa-db-fra.com

ViewPager OnItemClickListener

Je suis nouveau dans Viewpager, et après avoir lu http://developer.Android.com/reference/Android/support/v4/view/ViewPager.html de Google, je ne trouve rien qui se rapporte viewPager.setOnItemClickListener(new OnItemClickListener() { Avons-nous d'autres options pour agir en tant qu'élément cliqué?

Tester

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);
            }

        });

Erreur: La méthode setOnItemClickListener (new AdapterView.OnItemClickListener () {}) n'est pas définie pour le type ViewPager.

32
KC Chai

Il n'y a pas de méthode de rappel OnItemClick pour ViewPager. Si vous souhaitez cliquer sur des événements sur chaque page, vous devrez intégrer votre auditeur au contenu de la page dans votre adaptateur.

quelque chose comme ça:

@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;
}

exactement ce dont vous avez besoin dépendra un peu de ce que vous faites dans la fonction instantiateItem() que vous n'avez pas encore publiée, je ne peux donc pas vous donner de réponse plus précise.

77
FoamyGuy

J'ai implémenté la personnalisation 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;
       }
    }
}

Et du code pour implémenter onItemClickListener

ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager);
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // your code
            }
        });
29
Volodymyr Yatsykiv

Je ne suis pas sûr de ce à quoi vous vous attendriez de vous répondre avec l'auditeur ci-dessus.

Il existe un setOnClickListener(View.OnClickListener l) que vous pouvez utiliser pour détecter un contact avec le viewPager.

Vous pouvez également utiliser onPageScrolled pour obtenir les entrées de l'utilisateur, et onPageSelected et 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);
        }
    }
}
1
HalR

dans votre activité vous pouvez remplacer:

 @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);
    }
1
tinyProgrammer