viewPaper+Fragment的布局,在初始化时会导致fragment的布局加载和网络请求数据(懒加载)

实现fragment的懒加载。

问题一:

Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。

        解决办法:在Fragment onCreateView方法中缓存View

private View rootView;//缓存Fragment view

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if(rootView==null){

//缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。

rootView=inflater.inflate(R.layout.tab_fragment, null);

        

ViewGroup parent = (ViewGroup) rootView.getParent();        

if (parent != null) { 

           parent.removeView(rootView);  

  }

 return rootView;

}

这样就能保存状态,避免重发加载布局。

二:防止在初始化viewPaper时创建了其他fragment的布局和加载了数据。(懒加载)

实现思路:只有在当前fragment显示并且布局已经初始化完成后才加载数据。

http://blog.csdn.net/maosidiaoxian/article/details/38300627(此微博有讲创建一个基类Fragment,其他类来继承都可以用。)

下面是我自己写的方法。


1,//先初始化
private boolean isPrepared = false, isVisible = false;//是否加载完成,是否可见。
private View root;
 
2,onCreateView方法
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    root = inflater.inflate(R.layout.infor_fragment, container, false);
    System.out.println("Infor_Fragment----onCreateView");
    isPrepared = true;//表示布局加载好了
    initView(root);
    return root;
}
private void initView(View root) {
    System.out.println("Infor_Fragment----initView");
//只满足一个条件就不会往下执行了,别return了。下面了初始化控件和网络请求
    if (!isVisible || !isPrepared) {
        return;
    }
	//初始化控件、网络请求
}
3,关键方法(fragment有监听布局是否可见的方法)
 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        System.out.println("Infor_Fragment----setUserVisibleHint");
        if (getUserVisibleHint()) {
            System.out.println("Infor_Fragment1----" + isVisible);
            isVisible = true;
            initView(root);//两个都为true,这个方法就可以一直往下执行。(此时才加载数据)
        } else {
            System.out.println("Infor_Fragment2----" + isVisible);
            isVisible = false;
	//可以做一些销毁的操作。
        }
    }

这个开发一定用得到,总结:

1,防止fragment重复创建,保存状态减少网络请求,保存状态

2,避免在第一次初始化时创建布局并加载数据。数据请求量非常大。



### 使用 ViewPager 向 Fragment 传递数据Android 开发中,`ViewPager` 是一种常见的用于管理多个 `Fragment` 的组件。为了实现在 `ViewPager` 中向各个 `Fragment` 传递数据的功能,可以采用以下方法。 #### 方法一:通过 Bundle 设置参数 当创建 `Fragment` 实例时,可以通过 `Bundle` 将数据传递给它。以下是具体实现方式: 1. **定义 Fragment 类并提供静态工厂方法** 创建一个接受 `Bundle` 参数的构造函数,并将其存储到实例变量中。 ```java public class MyFragment extends Fragment { private String mData; public static MyFragment newInstance(String data) { MyFragment fragment = new MyFragment(); Bundle args = new Bundle(); args.putString("data_key", data); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mData = getArguments().getString("data_key"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_my, container, false); TextView textView = view.findViewById(R.id.textView); textView.setText(mData); // 显示接收到的数据 return view; } } ``` 2. **在 Adapter 中初始化 Fragment 并传入数据** 在自定义的 `FragmentPagerAdapter` 或 `FragmentStatePagerAdapter` 中,调用上述 `newInstance()` 方法来创建带有初始数据的 `Fragment` 实例[^1]。 ```java public class MyAdapter extends FragmentStatePagerAdapter { private List<String> dataList; // 数据列表 public MyAdapter(FragmentManager fm, List<String> dataList) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); this.dataList = dataList; } @Override public Fragment getItem(int position) { return MyFragment.newInstance(dataList.get(position)); // 传递对应位置的数据 } @Override public int getCount() { return dataList.size(); // 返回页面数量 } } ``` 3. **设置 ViewPager Adapter** 配置 `ViewPager` 并绑定适配器。 ```java ViewPager viewPager = findViewById(R.id.viewPager); List<String> dataList = Arrays.asList("Page One", "Page Two", "Page Three"); // 示例数据 MyAdapter adapter = new MyAdapter(getSupportFragmentManager(), dataList); viewPager.setAdapter(adapter); ``` #### 方法二:通过接口回调机制 如果需要动态更新 `Fragment` 的内容,则可以在 `Activity` `Fragment` 之间建立通信桥梁。这种方式适用于更复杂的场景。 1. 定义一个接口供 `Fragment` 调用以获取最新数据。 2. 让宿主 `Activity` 实现该接口,并将其实例传递给 `Fragment`。 3. 当数据发生变化时,通知对应的 `Fragment` 更新其视图。 这种方法的具体实现较为复杂,在此不展开赘述,可参考官方文档或相关教程进一步学习[^2]。 --- ### Vue.js 技术栈对比(扩展阅读) 虽然题目主要讨论的是 Android 开发中的数据传递问题,但提到的 Vue.js 生态系统也值得关注。Vue 提供了多种状态管理组件间通讯的方式,例如 Vuex、Props/Events 等工具可以帮助开发者高效构建现代化前端应用[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值