Android 加载几页后如何设置OffScreenPageLimit()?
我有一个相对复杂的布局,可以在viewpager中重用,有5页。viewpager位于父片段中 我的问题是,如果我不使用Android 加载几页后如何设置OffScreenPageLimit()?,android,android-fragments,android-viewpager,fragment,Android,Android Fragments,Android Viewpager,Fragment,我有一个相对复杂的布局,可以在viewpager中重用,有5页。viewpager位于父片段中 我的问题是,如果我不使用setOffscreenPageLimit(4)我的viewpager在浏览页面时会变得非常口吃,因为片段没有及时加载。缺点是,如果我使用setOffscreenPageLimit(4),我的父片段需要很长时间才能加载(大约3秒)。加载所花费的时间为空 我想知道,一旦加载了一些片段,是否有一种方法可以使用setOffscreenPageLimit(4),以便可以即时查看初始页面
setOffscreenPageLimit(4)
我的viewpager在浏览页面时会变得非常口吃,因为片段没有及时加载。缺点是,如果我使用setOffscreenPageLimit(4)
,我的父片段需要很长时间才能加载(大约3秒)。加载所花费的时间为空
我想知道,一旦加载了一些片段,是否有一种方法可以使用setOffscreenPageLimit(4)
,以便可以即时查看初始页面,而其他页面则加载在后台并保存在内存中
活动
public class MainActivity extends BaseActivity {
public static int layout;
public static ArrayList<ArrayList<Period>> bigList;
private static final int TASKS = 0;
private static final int TIMETABLE = 1;
@BindView(R.id.navigation_view)
NavigationView navigationView;
@BindView(R.id.main_content)
DrawerLayout drawerLayout;
Runnable runnable;
String themeName;
int currentFragment;
@Override
@SuppressLint("InflateParams")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
ViewGroup drawerContent = findViewById(R.id.drawer_content_container);
drawerContent.addView(getLayoutInflater().inflate(R.layout.activity_main_content, null));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
TypedValue outValue = new TypedValue();
getTheme().resolveAttribute(R.attr.themeName, outValue, true);
themeName = (String) outValue.string;
setUpNavigationView();
layout = R.layout.fragment_timetable_page;
String layoutString = this.getSharedPreferences("prefs", Context.MODE_PRIVATE).getString("layout", "flat");
switch (layoutString) {
case "card":
layout = R.layout.fragment_timetable__page_cardview;
break;
case "flat":
layout = R.layout.fragment_timetable_page;
}
bigList = new ArrayList<>();
ArrayList<Period> periods = Util.getPeriods(this);
ArrayList<Period> monPeriods = new ArrayList<>();
ArrayList<Period> tuePeriods = new ArrayList<>();
ArrayList<Period> wedPeriods = new ArrayList<>();
ArrayList<Period> thuPeriods = new ArrayList<>();
ArrayList<Period> friPeriods = new ArrayList<>();
int[] mon = {0, 1, 2, 3, 4, 5};
int[] tue = {6, 7, 8, 9, 10, 11};
int[] wed = {12, 13, 14, 15, 16, 17};
int[] thu = {18, 19, 20, 21, 22, 23};
int[] fri = {24, 25, 26, 27, 28, 29};
for (int count = 0; count < 6; count++) {
if (periods != null && periods.size() == 30) {
monPeriods.add(periods.get(mon[count]));
tuePeriods.add(periods.get(tue[count]));
wedPeriods.add(periods.get(wed[count]));
thuPeriods.add(periods.get(thu[count]));
friPeriods.add(periods.get(fri[count]));
} else if (periods != null) {
getSharedPreferences("periods", Context.MODE_PRIVATE).edit().clear().apply();
startActivity(new Intent(this, MainActivity.class));
}
}
bigList.add(monPeriods);
bigList.add(tuePeriods);
bigList.add(wedPeriods);
bigList.add(thuPeriods);
bigList.add(friPeriods);
if (savedInstanceState == null) {
switch (Util.getInstance(this).getLastFragment()) {
case TIMETABLE:
setCurrentFragment(TIMETABLE, false);
break;
case TASKS:
setCurrentFragment(TASKS, false);
break;
}
}
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
if (runnable != null) {
runnable.run();
}
}
};
drawerLayout.addDrawerListener(mDrawerToggle);
updateNavigationDrawerHeader();
}
private void setUpNavigationView() {
int accentColor = ThemeStore.accentColor(this);
NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.icon_color, ThemeStore.textColorSecondary(this)), accentColor);
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
navigationView.setCheckedItem(R.id.nav_timetable);
navigationView.setNavigationItemSelectedListener(item -> {
drawerLayout.closeDrawers();
switchView(item.getItemId());
return true;
});
for (int i = 0; i < navigationView.getChildCount(); i++) {
navigationView.getChildAt(i).setOverScrollMode(View.OVER_SCROLL_NEVER);
}
}
private void switchView(int id) {
runnable = null;
switch (id) {
case R.id.nav_tasks:
runnable = () -> setCurrentFragment(TASKS, true);
break;
case R.id.nav_timetable:
runnable = () -> setCurrentFragment(TIMETABLE, true);
break;
case R.id.nav_settings:
new Handler().postDelayed(() -> startActivity(new Intent(getBaseContext(), SettingsActivity.class)), 200);
break;
case R.id.nav_about:
new Handler().postDelayed(() -> startActivity(new Intent(getBaseContext(), AboutActivity.class)), 200);
}
}
private void updateNavigationDrawerHeader() {
View navigationDrawerHeader = navigationView.getHeaderView(0);
StatusBarView statusBarView = navigationDrawerHeader.findViewById(R.id.status_bar);
TypedValue a = new TypedValue();
getTheme().resolveAttribute(android.R.attr.windowBackground, a, true);
int toolbarColor = ThemeStore.primaryColor(this);
if (getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("flat_ui", false)) {
toolbarColor = a.data;
}
if (themeName.equals("light") && !ColorUtil.isColorLight(toolbarColor)){
statusBarView.setBackgroundColor(Color.parseColor("#26000000"));
}
TextView title = navigationDrawerHeader.findViewById(R.id.title);
title.setText(R.string.app_name);
if (!themeName.equals("light")) {
title.setTextColor(Color.WHITE);
}
}
private void setCurrentFragment(int key, boolean navDrawer) {
if ((key != currentFragment && navDrawer) || !navDrawer) {
Util.getInstance(this).setLastFragment(key);
Fragment fragmentToInflate;
switch (key) {
case TASKS:
navigationView.setCheckedItem(R.id.nav_tasks);
fragmentToInflate = TasksFragment.newInstance(navDrawer);
break;
case TIMETABLE:
navigationView.setCheckedItem(R.id.nav_timetable);
if (Util.getPeriods(this) != null) {
fragmentToInflate = TimetableFragment.newInstance(navDrawer);
} else {
fragmentToInflate = TimetableNotCompletedFragment.newInstance(navDrawer);
}
break;
default:
fragmentToInflate = TimetableFragment.newInstance(navDrawer);
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToInflate, null).commit();
currentFragment = key;
}
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(navigationView)) {
drawerLayout.closeDrawer(navigationView);
} else {
super.onBackPressed();
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (drawerLayout.isDrawerOpen(navigationView)) {
drawerLayout.closeDrawer(navigationView);
} else {
drawerLayout.openDrawer(navigationView);
}
return true;
}
return super.onOptionsItemSelected(item);
}
}
子片段(第页)
公共类TimetableFragmentPage扩展片段实现View.OnClickListener{
私有视图[]期间=新视图[6];
私有文本视图[]标识=新文本视图[6];
私有文本视图[]主题=新文本视图[6];
私有文本视图[]详细信息=新文本视图[6];
私有IconImageView[]图标=新IconImageView[6];
私有图标按钮[]信息图标=新图标按钮[6];
星期一的私人国际会议;
公共时间表碎片页(){
}
静态TimetableFragmentPage newInstance(整数天,整数布局){
TimetableFragmentPage fragment=新的TimetableFragmentPage();
Bundle args=新Bundle();
args.putInt(“dayOfWeek”,day);
参数putInt(“布局”,布局);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){
int layout=getArguments().getInt(“布局”);
视图=充气机。充气(布局、容器、假);
ButterKnife.bind(这个,视图);
setRetainInstance(真);
时段[0]=view.findViewById(R.id.P1);
句点[1]=view.findViewById(R.id.P2);
时段[2]=view.findViewById(R.id.P3);
时段[3]=view.findViewById(R.id.P4);
periods[4]=view.findviewbyd(R.id.P5);
时段[5]=view.findViewById(R.id.P6);
返回视图;
}
@凌驾
public void onStart(){
super.onStart();
setUpLayout();
}
专用布局(){
dayOfWeek=getArguments().getInt(“dayOfWeek”);
ArrayList periodData=MainActivity.bigList.get(dayOfWeek);
对于(int count=0;count<6;count++){
idents[count]=时段[count].findViewById(R.id.periodint);
受试者[count]=周期[count].findViewById(R.id.periodSub);
详细信息[count]=期间[count]。findViewById(R.id.periodDetails);
icons[count]=句点[count].findViewById(R.id.icon);
infoIcons[count]=句点[count].findViewById(R.id.periodInfo);
idents[count].setTextColor(ThemeStore.accentColor(getContext());
图标[count].setImageResource(periodData.get(count).getSubject(getContext()).GetSubjecticCon());
subjects[count].setText(periodData.get(count).getSubject(getContext()).getSubjectName());
教师=新教师(“教师姓氏”、“教师姓氏”、“教师头衔”,getContext());
房间=新房间(“房间前缀”,“房间”,getContext());
for(主题:Util.getSubjects(getContext())){
for(int index=0;index
我建议的第一件事是尽可能优化代码。从用户的角度来看,花3秒钟加载一个页面是非常糟糕的
但是,您可以使用ViewTreeObserver.OnGlobalLayoutListener
来了解视图何时完成加载。我写了一个快速的例子,在我看到你实际上有一个片段托管你的ViewPager之前,但是这个概念仍然是一样的
基本上,这将在初始页面完全加载后设置屏幕外页面限制
//YourActivity
private ViewPager _viewPager;
public ViewPager getViewPager()
{
return this._viewPager;
}
//First fragment
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
((YourActivity)_context).getViewPager().setOffscreenPageLimit(4);
}
});
public class TimetableFragmentPage extends Fragment implements View.OnClickListener {
private View[] periods = new View[6];
private TextView[] idents = new TextView[6];
private TextView[] subjects = new TextView[6];
private TextView[] details = new TextView[6];
private IconImageView[] icons = new IconImageView[6];
private IconImageButton[] infoIcons = new IconImageButton[6];
private int dayOfWeek;
public TimetableFragmentPage() {
}
static TimetableFragmentPage newInstance(int day, int layout) {
TimetableFragmentPage fragment = new TimetableFragmentPage();
Bundle args = new Bundle();
args.putInt("dayOfWeek", day);
args.putInt("layout", layout);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
int layout = getArguments().getInt("layout");
View view = inflater.inflate(layout, container, false);
ButterKnife.bind(this, view);
setRetainInstance(true);
periods[0] = view.findViewById(R.id.P1);
periods[1] = view.findViewById(R.id.P2);
periods[2] = view.findViewById(R.id.P3);
periods[3] = view.findViewById(R.id.P4);
periods[4] = view.findViewById(R.id.P5);
periods[5] = view.findViewById(R.id.P6);
return view;
}
@Override
public void onStart() {
super.onStart();
setUpLayout();
}
private void setUpLayout(){
dayOfWeek = getArguments().getInt("dayOfWeek");
ArrayList<Period> periodData = MainActivity.bigList.get(dayOfWeek);
for (int count = 0; count < 6; count++) {
idents[count] = periods[count].findViewById(R.id.periodIdent);
subjects[count] = periods[count].findViewById(R.id.periodSub);
details[count] = periods[count].findViewById(R.id.periodDetails);
icons[count] = periods[count].findViewById(R.id.icon);
infoIcons[count] = periods[count].findViewById(R.id.periodInfo);
idents[count].setTextColor(ThemeStore.accentColor(getContext()));
icons[count].setImageResource(periodData.get(count).getSubject(getContext()).getSubjectIcon());
subjects[count].setText(periodData.get(count).getSubject(getContext()).getSubjectName());
Teacher teacher = new Teacher("teacherFirstName", "teacherLastName", "teacherTitle", getContext());
Room room = new Room("roomPrefix", "room", getContext());
for (Subject subject : Util.getSubjects(getContext())) {
for (int index = 0; index < subject.getTeachers().size(); index++) {
if (subject.getTeachers().get(index).getTeacherKey() == periodData.get(count).getTeacherKey()) {
teacher = subject.getTeachers().get(index);
break;
}
}
for (int index = 0; index < subject.getRooms().size(); index++) {
if (subject.getRooms().get(index).getRoomKey() == periodData.get(count).getRoomKey()) {
room = subject.getRooms().get(index);
break;
}
}
}
details[count].setText(room.getRoomPrefix() + room.getRoom() + ", " + teacher.getTeacherTitle() + " " + teacher.getTeacherLastName());
if (infoIcons[0] != null) {
idents[count].setText(getResources().getStringArray(R.array.periods)[count]);
infoIcons[count].setOnClickListener(this);
} else {
idents[count].setText(String.valueOf(count + 1));
periods[count].setOnClickListener(this);
}
}
}
@Override
public void onClick(View v) {
Intent view = new Intent(getContext(), SubjectViewActivity.class);
int[] basePeriod = {
0,
6,
12,
18,
24
};
int period = 0;
for (int count = 0; count < 6; count++) {
if (v == infoIcons[count] || v == periods[count]) {
period = count;
}
}
view.putExtra("period", basePeriod[dayOfWeek] + period);
startActivity(view);
}
}
//YourActivity
private ViewPager _viewPager;
public ViewPager getViewPager()
{
return this._viewPager;
}
//First fragment
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
((YourActivity)_context).getViewPager().setOffscreenPageLimit(4);
}
});