问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android viewpager 怎么预加载的

发布网友 发布时间:2022-05-04 11:46

我来回答

1个回答

热心网友 时间:2022-06-30 12:21

两个方法void setUserVisibleHint(boolean isVisibleToUser)、boolean getUserVisibleHint(),它们分别用作设置/获得Fragment可见状态,我们可以重写Fragment在其中做判断,代码如下:

import android.support.v4.app.Fragment;

public abstract class BaseFragment extends Fragment {

/** Fragment当前状态是否可见 */
protected boolean isVisible;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);

if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}

/**
* 可见
*/
protected void onVisible() {
lazyLoad();
}

/**
* 不可见
*/
protected void onInvisible() {

}

/**
* 延迟加载
* 子类必须重写此方法
*/
protected abstract void lazyLoad();
}

在我们的Fragment中,只需要继承这个类,然后重写其中的lazyLoad()方法,当Fragment对用户可见(即用户切换到此Fragment时)我们在lazyLoad()中加载所需数据,详细代码看下面,我写了个假的获取数据线程:

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class CustomListFragment extends BaseFragment {

private static final String FRAGMENT_INDEX = fragment_index;
private final int FIRST_FRAGMENT = 0;
private final int SECOND_FRAGMENT = 1;
private final int THIRD_FRAGMENT = 2;

private TextView mFragmentView;

private int mCurIndex = -1;
/** 标志位,标志已经初始化完成 */
private boolean isPrepared;
/** 是否已被加载过一次,第二次就不再去请求数据了 */
private boolean mHasLoadedOnce;

/**
* 创建新实例
*
* @param index
* @return
*/
public static CustomListFragment newInstance(int index) {
Bundle bundle = new Bundle();
bundle.putInt(FRAGMENT_INDEX, index);
CustomListFragment fragment = new CustomListFragment();
fragment.setArguments(bundle);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(mFragmentView == null) {
mFragmentView = (TextView) inflater.inflate(R.layout.fragment, container, false);
//获得索引值
Bundle bundle = getArguments();
if (bundle != null) {
mCurIndex = bundle.getInt(FRAGMENT_INDEX);
}
isPrepared = true;
lazyLoad();
}

//因为共用一个Fragment视图,所以当前这个视图已被加载到Activity中,必须先清除后再加入Activity
ViewGroup parent = (ViewGroup)mFragmentView.getParent();
if(parent != null) {
parent.removeView(mFragmentView);
}
return mFragmentView;
}

@Override
protected void lazyLoad() {
if (!isPrepared || !isVisible || mHasLoadedOnce) {
return;
}

new AsyncTask() {

@Override
protected void onPreExecute() {
super.onPreExecute();
//显示加载进度对话框
UIHelper.showDialogForLoading(getActivity(), 正在加载..., true);
}

@Override
protected Boolean doInBackground(Void... params) {
try {
Thread.sleep(2000);
//在这里添加调用接口获取数据的代码
//doSomething()
} catch (Exception e) {
e.printStackTrace();
}
return true;
}

@Override
protected void onPostExecute(Boolean isSuccess) {
if (isSuccess) {
// 加载成功
setView();
mHasLoadedOnce = true;
} else {
// 加载失败
}
//关闭对话框
UIHelper.hideDialogForLoading();
}
}.execute();
}

private void setView() {
// 根据索引加载不同视图
switch (mCurIndex) {
case FIRST_FRAGMENT:
mFragmentView.setText(第一个);
break;

case SECOND_FRAGMENT:
mFragmentView.setText(第二个);
break;

case THIRD_FRAGMENT:
mFragmentView.setText(第三个);
break;
}
}
}

到这里我们只是写好了Fragment,在FragmentActivity中还需要对ViewPager设置一下,让它每次只加载一个Fragment,ViewPager.setOffscreenPageLimit(int limit),其中参数可以设为0或者1,参数小于1时,会默认用1来作为参数,未设置之前,ViewPager会默认加载两个Fragment。所以,我们只需要调用下它,设置下加载Fragment个数即可。

import java.util.ArrayList;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RadioButton;
import android.os.Bundle;

public class MainActivity extends FragmentActivity implements OnClickListener{

private RadioButton mFstBtn;
private RadioButton mSndBtn;
private RadioButton mThdBtn;

private ViewPager mViewPager;
private ListFragmentPagerAdapter mPagerAdapter;
private List mFragments = new ArrayList();

private final int FIRST_FRAGMENT = 0;
private final int SECOND_FRAGMENT = 1;
private final int THIRD_FRAGMENT = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initButton();
initViewPager();
}

/**
* 初始化按钮
*/
private void initButton() {
mFstBtn = (RadioButton)findViewById(R.id.id_rb_fst);
mFstBtn.setOnClickListener(this);
mSndBtn = (RadioButton)findViewById(R.id.id_rb_snd);
mSndBtn.setOnClickListener(this);
mThdBtn = (RadioButton)findViewById(R.id.id_rb_thd);
mThdBtn.setOnClickListener(this);
}

/**
* 初始化ViewPager控件
*/
private void initViewPager() {
mViewPager = (ViewPager)findViewById(R.id.id_vp_viewpager);
//关闭预加载,默认一次只加载一个Fragment
mViewPager.setOffscreenPageLimit(1);
//添加Fragment
mFragments.add(CustomListFragment.newInstance(FIRST_FRAGMENT));
mFragments.add(CustomListFragment.newInstance(SECOND_FRAGMENT));
mFragments.add(CustomListFragment.newInstance(THIRD_FRAGMENT));
//适配器
mPagerAdapter = new ListFragmentPagerAdapter(getSupportFragmentManager(), mFragments);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOnPageChangeListener(onPageChangeListener);
}

private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {
//根据用户选中的按钮修改按钮样式
switch (position) {
case FIRST_FRAGMENT:
mFstBtn.setChecked(true);
mSndBtn.setChecked(false);
mThdBtn.setChecked(false);
break;

case SECOND_FRAGMENT:
mFstBtn.setChecked(false);
mSndBtn.setChecked(true);
mThdBtn.setChecked(false);
break;

case THIRD_FRAGMENT:
mFstBtn.setChecked(false);
mSndBtn.setChecked(false);
mThdBtn.setChecked(true);
break;
}
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}

@Override
public void onPageScrollStateChanged(int arg0) {}
};

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_rb_fst:
mViewPager.setCurrentItem(FIRST_FRAGMENT);
break;

case R.id.id_rb_snd:
mViewPager.setCurrentItem(SECOND_FRAGMENT);
break;

case R.id.id_rb_thd:
mViewPager.setCurrentItem(THIRD_FRAGMENT);
break;
}
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 真空包装袋破洞里面的东西还能吃吗 真空包装袋破了,里边的腊肉还能吃吗? 冷冻真空产品漏气还能吃吗 真空包装的火锅底料因天热松动还能吃不 玉渊潭附近76路公交车路线 自己盆栽的草莓现在有一颗全红了 里面熟了没阿 红几天后采摘最好呢? 北京做76路公交车能倒40路吗 6路、18路、39路、60路、76路、79路分别属于哪个公交公司的车辆? 北京公交76路和78路广安门总站是在一起吗? 什么是多方,什么是空方? 小米手环怎么调时间呀? 北京1号线地铁在哪站可以倒76路公交车,是在八宝山下还是八角游乐园下呢?就是不用动,直接可以倒7 想知道:北京市 从焦家坟路口南到鹫峰国家森林公园怎么坐公交? 上海黄金交易所的黄金T+D 卖平仓 和买平仓 是谁和谁完成交易的。 五年级数学上册方程检验写出例子,多少都行? 什么叫做多头/空头(金盛金融)? 北京76路公交车行驶路线谢谢各位了 小学数学解方程的检验过程? 股票中“多方”和“空方”是什么意识,谢谢! 股票市场上空头和多头是之什么 android viewpager滑动自动回预加载吗 viewpager中fragment数据更新不能及时显示问题 viewpager一般预加载多少页 viewpager嵌套fragment懒加载怎么做的 如果viewpager中放置的多个fragment都是一样的ui效果,区别仅仅就是显示的数据内容不一样,如何复用碎片 android viewpager如何替换fragment android怎么viewpager实现循环切换图片 Android开发,有两个fragment,其中一个fragment中是一个传感器应用界面, Fragment的add和addToBackStack的区别,求大神赐教 android studio下怎么用viewpager+fragment做出tabs 这张图片,想问大家上面电表出来哪边的是零线。哪边的是火线。下方公开那边是零线,哪边是火线? 在线等 哪个是火线哪个是零线谢谢 公共点是零线还是火线? 输出的四个公开火线共一条零线是否?还有地线怎样接请教高手解答 这是入户配电箱,三相电的 我想在这里加个公开,公开接出几个插排用,想问下如何判断零线火线,这里哪个 我敷了艾瘦瘦身包,怎么肚子老是咕噜咕噜的事怎么回事? xcode,不知道点了什么,运行时看不到了结果显示在哪里,求大神相助 冠心病患者一定会心肌梗死吗 冠心病会不会很严重? 心梗的症状初期表现是什么,轻微心梗的症状有哪些?我妈有冠心病,停药后感觉胸痛频繁,是不是心梗呢?