简体   繁体   中英

ViewPager2 fragment click event

I'm trying to use viewpager2 in fragment and make each pages clickable. But all solutions are not working for me.

I tried to make ListPageAdapter to extend RecyclerView.ViewHolder and custom viewHolder by using onCreateViewHolder and onBindViewHolder like recyclerView but it already extended FragmentStateAdapter for making fragment. How can i make it clickable? Here is my code

ListPageAdapter.java

public class ListPageAdapter extends FragmentStateAdapter {

public int mCount;
private LayoutInflater mInflate;
private OnListItemClickListener listener;

public ListPageAdapter(FragmentActivity fa, int count) {
    super(fa);
    mCount = count;
}

@NonNull
@Override
public Fragment createFragment(int position) {
    int index = getRealPosition(position);

    if(index==0) return new Swipe1();
    else if(index==1) return new Swipe2();
    else if(index==2) return new Swipe3();
    else if(index==3) return new Swipe4();
    else return new Swipe5();

}

@Override
public int getItemCount() {
    return 2000;
}

public int getRealPosition(int position) { return position % mCount; }

}

TextSearch.java

public class TextSearch extends AppCompatActivity {

private Button submitBtn;
private CircleIndicator3 mIndicator;
private ViewPager2 mPager;
private FragmentStateAdapter pagerAdapter;
private int num_page = 5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_text_search);
    submitBtn = findViewById(R.id.submitBtn);

    //ViewPager2
    mPager = findViewById(R.id.viewpager);

    //Adapter
    pagerAdapter = new ListPageAdapter(this, num_page);

    //Indicator
    mIndicator = findViewById(R.id.indicator);


    //ViewPager Setting
    mPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
    mPager.setCurrentItem(1000);
    mPager.setOffscreenPageLimit(3);

    mPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
            if (positionOffsetPixels == 0) {
                mPager.setCurrentItem(position);
            }
        }

        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            mIndicator.animatePageSelected(position % num_page);
        }

    });


    final float pageMargin = getResources().getDimensionPixelOffset(R.dimen.pageMargin);
    final float pageOffset = getResources().getDimensionPixelOffset(R.dimen.offset);

    mPager.setPageTransformer(new ViewPager2.PageTransformer() {
        @Override
        public void transformPage(@NonNull View page, float position) {
            float myOffset = position * -(2 * pageOffset + pageMargin);
            if (mPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
                if (ViewCompat.getLayoutDirection(mPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
                    page.setTranslationX(-myOffset);
                } else {
                    page.setTranslationX(myOffset);
                }
            } else {
                page.setTranslationY(myOffset);
            }
        }
    });
    submitBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mPager.setAdapter(pagerAdapter);
            mIndicator.setViewPager(mPager);
            mIndicator.createIndicators(num_page, 0);

            String sendText = textLine.getText().toString();
            Log.d("calling", sendText);

            FileUploadUtils.sendText(sendText);

        }
    });
}

}

You can use the same approach as for a common fragments. In Fragment(page of a pager) Override onAttach method and implement it like this.

    @Override
    public void onAttach(@NotNull Context context) {
        super.onAttach(context);
        try {
            pageClickListener = ((PageClickListener) context);
        } catch (Exception e) {
            Log.e("SwipeFragment", "Root activity must implement PageClickListener");
        }
    }

And a root activity have to implement your listener.

public class MainActivity implements PageClickListener

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