如何在Activity中获取ViewPager2选中项数据并通过Toast显示描述
How to Get Selected Item Data from ViewPager2 to Show in Toast
我来帮你解决这个问题!你已经能拿到选中页的position了,只需要把对应的数据源和这个位置关联起来就行,这里有两种简单靠谱的方案:
方案一:把数据源设为Activity的成员变量
这个方法最直接,你只需要把fetchDummyData()返回的列表变成MainActivity的全局成员,这样在onPageSelected回调里就能直接通过position获取对应的数据了。
修改后的MainActivity代码:
public class MainActivity extends AppCompatActivity { private ViewPager2 viewPager2; // 新增:把数据源设为成员变量 private List<PagerM> pagerDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager2 = findViewById(R.id.viewPager2); // 先获取数据并赋值给成员变量 pagerDataList = fetchDummyData(); PagerAdapter pagerAdapter = new PagerAdapter(pagerDataList); viewPager2.setAdapter(pagerAdapter); viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL); viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { super.onPageScrolled(position, positionOffset, positionOffsetPixels); } @Override public void onPageSelected(int position) { super.onPageSelected(position); // 直接通过position从成员变量里拿数据 PagerM selectedItem = pagerDataList.get(position); Toast.makeText(MainActivity.this, selectedItem.getPagerDescription(), Toast.LENGTH_SHORT).show(); } @Override public void onPageScrollStateChanged(int state) { super.onPageScrollStateChanged(state); } }); } private List<PagerM> fetchDummyData() { List<PagerM> pagerMList = new ArrayList<>(); String[] dummyArr = getResources().getStringArray(R.array.array_str_values); for (String str : dummyArr) { PagerM pagerM = new PagerM(); pagerM.setPagerDescription(str); pagerMList.add(pagerM); } return pagerMList; } }
方案二:在PagerAdapter中添加获取数据的方法
如果更在意代码封装性,不想把数据源暴露在Activity里,可以给你的PagerAdapter加一个公开方法来获取指定位置的数据:
首先修改PagerAdapter,添加getItem方法:
public class PagerAdapter extends RecyclerView.Adapter { private List<PagerM> pagerMList; class PagerViewHolder extends RecyclerView.ViewHolder { private TextView txtDescription; public PagerViewHolder(@NonNull View itemView) { super(itemView); txtDescription = itemView.findViewById(R.id.txtDescription); } } public PagerAdapter(List<PagerM> pagerMList) { this.pagerMList = pagerMList; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_pager, parent, false); return new PagerViewHolder(view); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { PagerViewHolder viewHolder = (PagerViewHolder) holder; PagerM pagerM = pagerMList.get(position); viewHolder.txtDescription.setText(pagerM.getPagerDescription()); } // 新增:获取指定位置的数据 public PagerM getItem(int position) { if (position >= 0 && position < pagerMList.size()) { return pagerMList.get(position); } return null; } @Override public int getItemCount() { return pagerMList.size(); } }
然后在MainActivity里,通过Adapter获取数据:
@Override public void onPageSelected(int position) { super.onPageSelected(position); // 先拿到Adapter实例,调用getItem方法 PagerAdapter adapter = (PagerAdapter) viewPager2.getAdapter(); if (adapter != null) { PagerM selectedItem = adapter.getItem(position); if (selectedItem != null) { Toast.makeText(MainActivity.this, selectedItem.getPagerDescription(), Toast.LENGTH_SHORT).show(); } } }
两种方案的选择
- 方案一适合简单场景,代码少,直接高效;
- 方案二更符合面向对象的封装原则,避免数据源暴露,适合复杂项目或者需要复用Adapter的场景。
内容的提问来源于stack exchange,提问作者farfar009
相关产品推荐
相关产品推荐

