You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:39