android - ViewPager2 片段点击事件
问题描述
我正在尝试在片段中使用 viewpager2 并使每个页面都可点击。但是所有解决方案都不适合我。
我试图让 ListPageAdapter 通过使用 onCreateViewHolder 和 onBindViewHolder 来扩展 RecyclerView.ViewHolder 和自定义 viewHolder,但它已经扩展了 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; }
}
文本搜索.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");
}
}
并且根活动必须实现您的侦听器。
public class MainActivity implements PageClickListener
推荐阅读
- delphi - IdHTTP 使用哪种传输协议
- jquery - 声明 ajax API 会破坏页面格式
- jhipster - 无法设置未定义的属性“分页”
- java - 为什么我的 JComboBox 的 ComboBoxModel 从来没有调用 seSelectedItem()?
- php - 如何在网站代码中引用 .po/.pot 文件?
- android - 使用keras,tensorflow在android上的照片(不是画布)中手写数字识别中所有数字的相同标签值
- android - Firebase C++ SDK 如何为 DatabaseReference 和 DatabaseSnapshot 分配内存?
- php - Why PHP don't see extension dll file?
- html - 将网络表格中的信息提取到 Excel 中
- amazon-web-services - 如何将面向公众的负载均衡器连接到私有 VPC 中的 EC2 实例