简体   繁体   中英

How to handle multiple button clicks in ViewPager in Android?

I have a ViewPager powered by an external API. Each page has three buttons. When those buttons are clicked, the app crashes. My adapter is as follows.

 public class ViewPagerAdapter extends PagerAdapter{

    private Activity activity;
    private LayoutInflater inflater;
    private List<NewsModel> newsItems;
    Context context;
    View itemView;
    public ViewPagerAdapter(Activity activity, List<NewsModel> newsItems){
    this.activity = activity;
    this.newsItems = newsItems;
}

@Override
public int getCount() {
    return newsItems.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view ==((LinearLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position){

    TextView mAuthor;
    NetworkImageView networkImageView;
    ImageButton fav, sha, mor;

        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        itemView = inflater.inflate(R.layout.pager_item, container, false);
        imageLoader = AppController.getInstance().getImageLoader();

    mAuthor = (TextView) itemView.findViewById(R.id.nwAuthor);
    fav = (ImageButton) itemView.findViewById(R.id.fav);
    sha = (ImageButton) itemView.findViewById(R.id.sha);
    mor = (ImageButton)itemView.findViewById(R.id.mor);
   networkImageView = (NetworkImageView) itemView.findViewById(R.id.nwImage);

    fav.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {

            View parentRow = (View) v.getParent();
            ViewPager vp = (ViewPager) parentRow.getParent();
            final int position = vp.getCurrentItem();


    });

  networkImageView.setImageUrl(newsItems.get(position).getUrlToImageNews(), imageLoader);
    mAuthor.setText(newsItems.get(position).getAuthor());
    Log.d("Aseem Savio",newsItems.get(position).getAuthor());

    mTitle.setText(newsItems.get(position).getTitleNews());
    mDesc.setText(newsItems.get(position).getDescription());
    mTime.setText(newsItems.get(position).getPublishedAt());

    container.addView(itemView);

    return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    // Remove viewpager_item.xml from ViewPager
    ((ViewPager) container).removeView((LinearLayout) object);
}}

The following is the error log.

FATAL EXCEPTION: main Process: com.aseemsavio.picks, PID: 11298 java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v4.view.ViewPager at com.aseemsavio.picks.ViewPagerAdapter$2.onClick(ViewPagerAdapter.java:123) at android.view.View.performClick(View.java:5610) at android.view.View$PerformClick.run(View.java:22260) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

On the whole, how do I perform multiple button clicks in view pager? Do explain how we get the positions of items in the View Pager. Also, explain how to rectify the above errors. Thanks in advance.

You post your adapter ~70 lines of code but error on on 123 com.aseemsavio.picks.ViewPagerAdapter$2.onClick(ViewPagerAdapter.java:123)

looks like problem is here:

  ViewPager vp = (ViewPager) parentRow.getParent();

Because:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v4.view.ViewPager

it means that your parentRow.getParent(); retirns instance of Linearlayout

Try: in onClick:

iewPager vp = (ViewPager) findViewPagerParent(v);
if(vp != null) {
   //do your stuff 
}

add method

private View findViewPagerParent(View childView) {
    if (childView == null) {
          return null;
    }
    if (childView instanceof ViewPager) {
        return childView;
    } else {
        return findViewPagerParent((View) childView.getParent());
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM