动态更改ViewPager中Fragment的数据

本文介绍了一种在ViewPager中刷新Fragment数据的方法,通过重新创建Fragment来实现实时数据更新,适用于需要频繁更新数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们的ViewPager中,显示的每项子项都是通过适配器的形式添加的,对于ViewPager适配器的数据实时刷新我们可以直接通过调用适配器的**notifyDataSetChanged();**方法实现刷新,但我们的Fragment在显示时是在我们的内存中的,也就意味着不能动态对我们的Fragment数据进行刷新,那么对于Fragment的刷新无非就是两种方法,一种就是每次需要刷新时都重新创建一个Fragment,或者更改Fragment的ID,下面是第一种方法的实现方法:

  • Fragment中
public class OneFragment extends Fragment{
    private List<String> data;
    private ListView messageList;
    private ArrayAdapter adapter;

//    通过静态方法的形式传入数据,可以避免因界面重绘时造成传入数据丢失,比如当屏幕旋转时,活动会界面会重新绘制,这时候如果界面上有Fragment则会造成传入Fragment的数据丢失
    public static OneFragment newFratment(List<String> data){
        OneFragment f = new OneFragment();
        Bundle b = new Bundle();
        b.putStringArrayList("data", (ArrayList<String>) data);
//        除了八大基础数据类型之外,其他数据类型需要进行序列化,序列化的对象需要继承Serializable接口,否则无法完成序列化
        f.setArguments(b);
        return f;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        取出传入的数据信息
        Bundle b = getArguments();
        data = b.getStringArrayList("data");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View mView = inflater.inflate(R.layout.ont_fragment,container,false);
        messageList = mView.findViewById(R.id.messageList);
        adapter = new ArrayAdapter(getContext(),R.layout.support_simple_spinner_dropdown_item,data);
        messageList.setAdapter(adapter);
        return mView;
    }
//    刷新Fragment数据的方法
    public void updateFragment(List<String> data){
        this.data = data;//更新字段的值
        Bundle b = getArguments();
        if(b != null){
            b.putStringArrayList("data", (ArrayList<String>) data);//更新Arguments内的值
        }
    }
}
  • Adapter中
public class MessageShowAdapter extends FragmentStatePagerAdapter {
    private List<List<String>> data;//显示数据集合
    public MessageShowAdapter(@NonNull FragmentManager fm, List<List<String>> data) {
        super(fm);
        this.data = data;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        //调用OneFratment传递数据的方法,实现Fragment初始化、数据传递
        return OneFragment.newFratment(data.get(position));
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        //获取数据被更改的界面
        OneFragment fmt = (OneFragment)super.instantiateItem(container, position);
        //调用Fragment刷新数据的方法,刷新数据
        fmt.updateFragment(data.get(position));
        return fmt;//将刷新后的Fragment返回显示
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        //设置强制刷新
        return PagerAdapter.POSITION_NONE;
    }
}
  • Activity中
public class MainActivity extends AppCompatActivity {
    private ViewPager messageShow;//翻页控件
    private List<List<String> > data;//翻页控件子页数据集合(一个页面一个List<String>,这里是多个页面的数据集合)
    private MessageShowAdapter adapter;//翻页控件适配器
    private Button refresh;//刷新数据按钮

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bd();//先调用绑定控件的方法
        data = new ArrayList<>();//实例化数据集合
        AddData();//调用模拟动态添加数据的方法
        adapter = new MessageShowAdapter(getSupportFragmentManager(),data);//实例化适配器
        messageShow.setAdapter(adapter);//给翻页控件设置适配器
    }
//    关联控件的方法
    private void bd(){
        messageShow = findViewById(R.id.messageShow);
        refresh = findViewById(R.id.refresh);
        refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddData();//调用模拟动态台添加数据的方法
                adapter.notifyDataSetChanged();//刷新ViewPager适配器的数据(间接刷新Fragment数据)
            }
        });
    }
//    模拟动态添加数据的方法
    private void AddData(){
//        随机生成显示数据
//        data = new ArrayList<>();切勿每次更改数据时new一个ArrayList()对象!!!
        data.clear();
        List<String> one = new ArrayList<>();
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        one.add(new Random().nextInt(100) + "");
        data.add(one);

        List<String> two = new ArrayList<>();
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        two.add(new Random().nextInt(100) + "");
        data.add(two);

        List<String> three = new ArrayList<>();
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        three.add(new Random().nextInt(100) + "");
        data.add(three);
    }
}
  • **注意:**在MainActivity的布局文件中只有一个ViewPager控件和一个Button控件,Fragment布局文件中只有一个ListView控件

  • 该方法存在的缺陷是每次刷新都是重新创建Fragment,对内存消耗较大。

  • 在这个案例中,可以将ListView换成其他的控件,比如图标,在Fragment的onCreateView()方法中返回相应的视图即可,刷新只需更改data即可实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值