安卓学习笔记---使用ViewPager+Fragment实现切换动态加载刷新数据,有坑,需要自己做才能发现

本文详细记录了在Android开发中使用ViewPager结合Fragment实现Tab切换时动态加载数据的过程,包括实例化Fragment、参数获取与更新,以及在ViewPager适配器中的关键步骤。在实际操作中遇到了加载异常、数据重复等问题,并提供了解决方案,如在onCreateView中获取参数、在instantiateItem方法中更新数据等。
摘要由CSDN通过智能技术生成

当一个页面有3个Tab,可以滑动切换,自然想到了使用ViewPager+Fragment实现切换,如果每个Tab的页面都一致,只是请求接口的时候参数不一样的话,就自然会想到在Fragment实现动态加载数据。说的很简单,但是实际操作之后发现有很多的坑啊,各种问题,不能正常加载,或者页面没有显示等情况,现在记录一下,以免日后遇到相同的问题。

在Fragment中设置:

第一步:需要在Fragment进行实例化

主要是统一Fragment的实例化工作。如果Fragment需要外部传递参数,在此函数中要构造相关参数,这一步是必须的

public static MartialMoreFragment newInstance(String categoryArm) {
    MartialMoreFragment fragment = new MartialMoreFragment();
    Bundle bundle = new Bundle();
    bundle.putString("category", categoryArm);
    fragment.setArguments(bundle);
    return fragment;
}

第二步:在Fragment中参数的获取

一要在onCreate方法获取参数。我写在了onCreateView中获取参数,但是看到网上说在onCreate方法中比较好,而onCreateView方法在某些状态下并不会被调用,导致数据丢失。

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle args = getArguments();
    if (args != null) {
        this.category = args.getString("category");

    }
    LoggerUtil.i(TAG, "onCreate--category--->" + category);
}

第三步:在Fragment中参数的更新

更新Fragment内部成员变量的同时也要更新bundleArgs参数中的值。此步骤要和ViewPager适配器配合使用,实现Fragment动态刷新。这一步很关键,当滑动或者点击切换的时候就需要参数的更新,重新请求数据,否则就没有意义啦。

public void updateArguments(String categoryArm) {
    this.category = categoryArm;

    Bundle bundleArgs = getArguments();
    if (bundleArgs != null) {
        bundleArgs.putString("category", categoryArm);
    }
    LoggerUtil.i(TAG, "updateArguments--category--->" + category);
}

在ViewPager的适配器FragmentPagerAdapter中设置:

第一步:实现getItem方法

返回具体Fragment,并且初始化Fragment需要的参数,调用Fragment的newInstance()方法

@Override
public Fragment getItem(int position) {
    return MartialMoreFragment.newInstance(categorys[position]);
}

第二步:实现instantiateItem方法

如果需要动态刷新数据,就需要此方法,并且仅能在此方法里,不能是getItem。否则调用notifyDataSetChanged无效。

@Override
public Object instantiateItem(ViewGroup container, final int position) {
    MartialMoreFragment fragment  = (MartialMoreFragment) super.instantiateItem(container, position);
    fragment.updateArguments(categorys[position]);
    LoggerUtil.i("MartialMoreNoticeFragme","instantiateItem-->position-->"+position);
    return fragment;
}
第三步:实现getItemPosition方法

返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。

@Override
public int getItemPosition(Object object) {
    return PagerAdapter.POSITION_NONE;
}
第四步:也要实现ViewPager切换监听 OnPageChangeListener 方法

下面附上整体的Activity里面的代码,需要的话可以复制,保留自己需要的功能即可。

1.MartialMoreActivity:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class MartialMoreActivity extends BaseActivity implements View.OnClickListener {

    private ImageView img_martial_more_back;
    private TextView[] textViews;
    private TextView[] textViewLines;
    private ViewPager viewPager_martial;

    private String[] categorys = new String[]{
 "notice", "activity", "honor"};
    private String martialName;
    private TextView tv_title_name;
    @Override
    public int getContentView() {
        return R.layout.activity_martial_more;
    }

    @Override
    public void initViews(Bundle savedInstanceState) {

        martialName=getIntent().getStringExtra("martialName"
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值