android预加载布局,【Android】实战开发之ViewPager+Fragment预加载问题完美解决

Android实战开发中,当我们使用ViewPager+Fragment的时候肯定知道Fragment会预先加载两侧Fragment的布局,如果有大量数据的话,会造成Fragment卡顿现象,所以这里说明一种Fragment缓加载的方式,相当简单,只要继承以下父类Fragment,再在对应方法中加载数据即可实现Fragment缓加载了,剩下的注释很清楚,如果你还想在缓加载基础上实现下拉刷新等功能,那就更好了。

一、父类BaseFragment

import android.support.v4.app.Fragment;

/**

* 基础Fragment,子类Fragment都继承自它,尤其是ViewPager中的Fragment

* 因为ViewPager+Fragment组合使用时会产生预先加载前后Fragment,若再加上比较大的数据量,就会造成卡顿的现象,

* 为防止发生,可以在用户可见的时候加载数据,因此才会写一个BaseFragment

* @author tongleer.com

*

*/

public class BaseFragment extends Fragment{

/**

* 当前界面是否呈现给用户的状态标志

*/

protected boolean isVisible;

/**

* 重写Fragment父类生命周期方法,在onCreate之前调用该方法,实现Fragment数据的缓加载.

* @param isVisibleToUser 当前是否已将界面显示给用户的状态

*/

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

if(getUserVisibleHint()) {

isVisible = true;

onVisible();

} else {

isVisible = false;

onInvisible();

}

}

/**

* 当界面呈现给用户,即设置可见时执行,进行加载数据的方法

* 在用户可见时加载数据,而不在用户不可见的时候加载数据,是为了防止控件对象出现空指针异常

*/

protected void onVisible(){

setlazyLoad();

}

/**

* 当界面还没呈现给用户,即设置不可见时执行

*/

protected void onInvisible(){

}

/**

* 加载数据方法

*/

protected void setlazyLoad(){

}

}

二、子类DemoPreloadFragment

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

/**

* 预加载Fragment例子

* @author tongleer.com

*

*/

public class DemoPreloadFragment extends BaseFragment{

/**

* 预加载标志,默认值为false,设置为true,表示已经预加载完成,可以加载数据

*/

private boolean isPrepared;

/**

* Fragment生命周期方法,此view可改为自定义的布局

*/

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(android.R.layout.activity_list_item, container, false);

//TODO 此处初始化view中各个控件

isPrepared = true;

setlazyLoad();

return view;

}

/**

* 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据

*/

@Override

protected void setlazyLoad() {

super.setlazyLoad();

if(!isPrepared || !isVisible) {

return;

}

//TODO 此处填充view中各个控件的数据

}

}

over.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的实现 Android ViewPager 轮播图禁止加载且切换页面时不出现相邻页面白屏的示例代码: ```java public class BannerActivity extends AppCompatActivity { private ViewPager mViewPager; private BannerAdapter mAdapter; private List<BannerItem> mDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_banner); initData(); initView(); } private void initView() { mViewPager = findViewById(R.id.view_pager); mAdapter = new BannerAdapter(getSupportFragmentManager(), mDataList); mViewPager.setAdapter(mAdapter); mViewPager.setOffscreenPageLimit(1); mViewPager.setCurrentItem(mDataList.size() * 1000); // 添加页面切换监听器,禁止加载 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mAdapter.addExtraPages(position); } @Override public void onPageScrollStateChanged(int state) { } }); } private void initData() { mDataList = new ArrayList<>(); mDataList.add(new BannerItem(R.drawable.banner_1, "Banner 1")); mDataList.add(new BannerItem(R.drawable.banner_2, "Banner 2")); mDataList.add(new BannerItem(R.drawable.banner_3, "Banner 3")); mDataList.add(new BannerItem(R.drawable.banner_4, "Banner 4")); mDataList.add(new BannerItem(R.drawable.banner_5, "Banner 5")); } private static class BannerAdapter extends FragmentPagerAdapter { private List<BannerItem> mDataList; private SparseArray<Fragment> mExtraPages = new SparseArray<>(); BannerAdapter(FragmentManager fm, List<BannerItem> dataList) { super(fm); mDataList = dataList; } @Override public int getCount() { return mDataList.size() * 10000; } @Override public Fragment getItem(int position) { int index = position % mDataList.size(); return BannerFragment.newInstance(mDataList.get(index)); } public void addExtraPages(int position) { int index = position % mDataList.size(); if (mExtraPages.get(index) == null) { mExtraPages.put(index, BannerFragment.newInstance(mDataList.get(index))); } int left = index > 0 ? index - 1 : mDataList.size() - 1; if (mExtraPages.get(left) == null) { mExtraPages.put(left, BannerFragment.newInstance(mDataList.get(left))); } int right = index < mDataList.size() - 1 ? index + 1 : 0; if (mExtraPages.get(right) == null) { mExtraPages.put(right, BannerFragment.newInstance(mDataList.get(right))); } } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mExtraPages.put(position % mDataList.size(), fragment); return fragment; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { mExtraPages.remove(position % mDataList.size()); super.destroyItem(container, position, object); } } public static class BannerFragment extends Fragment { private BannerItem mItem; public static BannerFragment newInstance(BannerItem item) { BannerFragment fragment = new BannerFragment(); Bundle args = new Bundle(); args.putParcelable("item", item); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mItem = getArguments().getParcelable("item"); } } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_banner, container, false); ImageView imageView = view.findViewById(R.id.image_view); TextView textView = view.findViewById(R.id.text_view); imageView.setImageResource(mItem.getImageResId()); textView.setText(mItem.getTitle()); return view; } } public static class BannerItem implements Parcelable { private int imageResId; private String title; public BannerItem(int imageResId, String title) { this.imageResId = imageResId; this.title = title; } protected BannerItem(Parcel in) { imageResId = in.readInt(); title = in.readString(); } public static final Creator<BannerItem> CREATOR = new Creator<BannerItem>() { @Override public BannerItem createFromParcel(Parcel in) { return new BannerItem(in); } @Override public BannerItem[] newArray(int size) { return new BannerItem[size]; } }; public int getImageResId() { return imageResId; } public String getTitle() { return title; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(imageResId); dest.writeString(title); } } } ``` 在上面的代码中,我们禁止了 ViewPager 的加载,并手动添加了相邻页面。具体实现细节可以参考代码注释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值