ViewPager2片段点击事件

ViewPager2 fragment click event

我正在尝试在片段中使用 viewpager2 并使每个页面都可点击。 但是所有的解决方案都不适合我。

我试图让 ListPageAdapter 扩展 RecyclerView.ViewHolder 和自定义 viewHolder 通过使用 onCreateViewHolder 和 onBindViewHolder 像 recyclerView 但它已经扩展了 FragmentStateAdapter 来制作片段。 我怎样才能让它可点击? 这是我的代码

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

        }
    });
}

}

您可以使用与常见片段相同的方法。在 Fragment(page of a pager) 中覆盖 onAttach 方法并像这样实现它。

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

并且根 activity 必须实现您的侦听器。

public class MainActivity implements PageClickListener