it-swarm.com.de

ViewPager OnItemClickListener

Ich bin neu in Viewpager und nachdem ich http://developer.Android.com/reference/Android/support/v4/view/ViewPager.html von google gelesen habe, kann ich nichts dazu finden viewPager.setOnItemClickListener(new OnItemClickListener() { Haben wir andere Optionen, um als geklicktes Element zu fungieren?

Austesten

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

        });

Fehler: Die Methode setOnItemClickListener (neuer AdapterView.OnItemClickListener () {}) ist für den Typ ViewPager nicht definiert

32
KC Chai

Es gibt keine OnItemClick-Callback-Methode für ViewPager. Wenn Sie auf jeder Seite auf Ereignisse klicken möchten, müssen Sie Ihren Listener in den Seiteninhalt Ihres Adapters einbauen.

etwas wie das:

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

was genau Sie benötigen, wird ein wenig davon abhängen, was Sie sonst noch in instantiateItem() getan haben, was Sie nicht gepostet haben. Daher kann ich Ihnen keine genauere Antwort geben.

77
FoamyGuy

Ich habe benutzerdefinierte ViewPager implementiert:

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

Und Code zum Implementieren von onItemClickListener

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

Ich bin nicht sicher, was Sie erwarten würden, um mit dem oben genannten Hörer zu antworten.

Es gibt eine setOnClickListener(View.OnClickListener l), mit der Sie eine Berührung des viewPagers erkennen können.

Sie können auch onPageScrolled verwenden, um Benutzereingaben abzurufen, und onPageSelected und 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

Verwenden Sie EventBus.

Diesem Problem begegnete ich nur mit einer einfachen Lösung, indem ich einen OnClickListener am Adapter einstellte und dann das Ereignis sendete:

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

Der Erbauer:

    public Event(int code, int viewPagerPosition) {
    this.code = code;
    this.viewPagerPosition = viewPagerPosition;
}

Registrieren Sie die Aktivität, bei der Sie das Event erhalten möchten:

EventBus.getDefault().register(this);

Erhalte die Veranstaltung später einfach mit:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Event event) {
    if (event.getCode() == Constants.onViewPagerItem) {
        Toast.makeText(getContext(), "Item " + event.getViewPagerPosition(), Toast.LENGTH_SHORT).show();
    }
}

Überprüfen Sie dies, falls Sie es nicht wissen: https://github.com/greenrobot/EventBus

Ich hoffe es hilft.

in deiner Tätigkeit; Sie können überschreiben:

 @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