Skip to content

Commit 8a2cf57

Browse files
committed
1、使用ViewPager2实现懒加载 2、更新项目配置
1 parent 6c563ad commit 8a2cf57

File tree

11 files changed

+38
-91
lines changed

11 files changed

+38
-91
lines changed

README.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,20 @@
1515
### 介绍:
1616

1717
MVVM轻量快速开发框架:使用JetPack中的AndroidX + ViewModel + LiveData +
18-
DataBinding组件,同时使用RxJava2 + Retrofit2 + Glide等主流框架进行搭建
18+
DataBinding组件,同时使用ViewPager2 + RxJava2 + Retrofit2 +
19+
Glide等主流框架进行搭建
1920

2021
<img src="https://img-blog.csdnimg.cn/2019040114344440.gif" width="300">
2122

2223
### Demo下载体验
2324

24-
扫描下方二维码或者直接访问[TODO-MVVM](https://www.pgyer.com/mvvm)
25+
点击下载[TODO-MVVM](https://github.com/azhon/TODO-MVVM/releases/download/mvvm.apk)
2526

26-
<img src="https://github.com/azhon/TODO-MVVM/blob/master/img/img_code.png" width="150" height="150">
2727

2828
### 项目编译
2929

30-
因为本项目使用的都是较新的东西,所以建议使用`Android Studio 3.5`或更高版本进行编译
30+
因为本项目使用的都是较新的东西,所以建议使用`Android Studio
31+
3.6.1`或更高版本进行编译
3132

3233
### 使用步骤
3334

basicLib/build.gradle

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ dependencies {
3737
api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
3838
api 'io.reactivex.rxjava2:rxjava:2.1.16'
3939
api 'io.reactivex.rxjava2:rxandroid:2.0.2'
40-
api 'androidx.recyclerview:recyclerview:1.0.0'
40+
api 'androidx.recyclerview:recyclerview:1.1.0'
4141
api 'com.github.bumptech.glide:glide:4.9.0'
4242
api 'com.android.support:design:28.0.0'
4343
api 'androidx.appcompat:appcompat:1.1.0'
4444
api 'androidx.constraintlayout:constraintlayout:1.1.3'
45+
api 'androidx.viewpager2:viewpager2:1.0.0'
46+
api 'com.google.android.material:material:1.1.0'
4547
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
4648
testImplementation 'junit:junit:4.12'
4749
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package com.azhon.basic.base;
22

3-
import android.os.Bundle;
4-
import android.view.LayoutInflater;
5-
import android.view.View;
6-
import android.view.ViewGroup;
7-
8-
import androidx.annotation.NonNull;
9-
import androidx.annotation.Nullable;
103
import androidx.databinding.ViewDataBinding;
4+
import androidx.lifecycle.LifecycleObserver;
115

126
import com.azhon.basic.lifecycle.BaseViewModel;
137

@@ -22,57 +16,15 @@
2216
*/
2317

2418
public abstract class BaseLazyFragment<VM extends BaseViewModel, DB extends ViewDataBinding>
25-
extends BaseFragment<VM, DB> {
26-
27-
/**
28-
* 懒加载
29-
*/
30-
private boolean createView, activityCreated, lazy;
31-
/**
32-
* 这个Fragment是不是tab页面的第一个页面
33-
*/
34-
private boolean isFirstTab;
19+
extends BaseFragment<VM, DB> implements LifecycleObserver {
3520

36-
@Nullable
37-
@Override
38-
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
39-
View view = super.onCreateView(inflater, container, savedInstanceState);
40-
createView = true;
41-
return view;
42-
}
43-
44-
@Override
45-
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
46-
super.onActivityCreated(savedInstanceState);
47-
activityCreated = true;
48-
}
49-
50-
@Override
51-
public void setUserVisibleHint(boolean isVisibleToUser) {
52-
super.setUserVisibleHint(isVisibleToUser);
53-
if (isVisibleToUser && createView && activityCreated && !lazy) {
54-
//不是第一个Tab的Fragment 进行懒加载请求数据
55-
lazy = true;
56-
lazyLoad();
57-
} else if (isVisibleToUser && !createView && !activityCreated && !lazy) {
58-
//这个Fragment是多个Tab中的第一个
59-
isFirstTab = true;
60-
} else {
61-
//对用户可见时,是否需要重新刷新数据
62-
if (isVisibleToUser) {
63-
visibleToUser();
64-
}
65-
}
66-
}
21+
private boolean visibleToUser;
6722

6823
@Override
6924
public void onResume() {
7025
super.onResume();
71-
/**
72-
* 第一个Tab页面懒加载
73-
*/
74-
if (isFirstTab && !lazy) {
75-
lazy = true;
26+
if (!visibleToUser) {
27+
visibleToUser = true;
7628
lazyLoad();
7729
}
7830
}
@@ -81,9 +33,4 @@ public void onResume() {
8133
* 懒加载,只有在Fragment第一次创建且第一次对用户可见
8234
*/
8335
protected abstract void lazyLoad();
84-
85-
/**
86-
* 每次在Fragment与用户可见状态且不是第一次对用户可见
87-
*/
88-
protected abstract void visibleToUser();
8936
}

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77

88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:3.6.0-alpha01'
10+
classpath 'com.android.tools.build:gradle:3.6.1'
1111

1212
// NOTE: Do not place your application dependencies here; they belong
1313
// in the individual module build.gradle files
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Wed Oct 30 13:16:57 CST 2019
1+
#Wed Mar 25 22:55:36 CST 2020
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

img/img_1.png

-318 KB
Loading

img/img_code.png

-5.7 KB
Binary file not shown.

sample/src/main/java/com/azhon/mvvm/lazy/LazyActivity.java

+20-18
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.azhon.mvvm.lazy;
22

3-
import androidx.annotation.Nullable;
3+
import androidx.annotation.NonNull;
44
import androidx.fragment.app.Fragment;
5-
import androidx.fragment.app.FragmentPagerAdapter;
6-
import androidx.viewpager.widget.ViewPager;
5+
import androidx.fragment.app.FragmentActivity;
6+
import androidx.viewpager2.adapter.FragmentStateAdapter;
7+
import androidx.viewpager2.widget.ViewPager2;
78

89
import com.azhon.basic.base.BaseNoModelActivity;
910
import com.azhon.mvvm.R;
1011
import com.azhon.mvvm.databinding.ActivityLazyBinding;
1112
import com.google.android.material.tabs.TabLayout;
13+
import com.google.android.material.tabs.TabLayoutMediator;
1214

1315
import java.util.ArrayList;
1416
import java.util.List;
@@ -36,7 +38,7 @@ protected int onCreate() {
3638
@Override
3739
protected void initView() {
3840
setTitle("Fragment懒加载使用示例");
39-
ViewPager viewPager = dataBinding.viewPager;
41+
ViewPager2 viewPager = dataBinding.viewPager;
4042
TabLayout tabLayout = dataBinding.tabLayout;
4143

4244
list.add(LazyFragment.newInstance("5562b419e4b00c57d9b94ae2"));
@@ -51,10 +53,14 @@ protected void initView() {
5153
tabLayout.addTab(tabLayout.newTab().setText(title[2]), 2);
5254
tabLayout.addTab(tabLayout.newTab().setText(title[3]), 3);
5355

54-
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter();
56+
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(this);
5557
viewPager.setAdapter(adapter);
56-
tabLayout.setupWithViewPager(viewPager);
57-
tabLayout.setTabsFromPagerAdapter(adapter);
58+
new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
59+
@Override
60+
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
61+
tab.setText(title[position]);
62+
}
63+
}).attach();
5864

5965
}
6066

@@ -63,25 +69,21 @@ protected void initData() {
6369

6470
}
6571

66-
private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
67-
public MyFragmentPagerAdapter() {
68-
super(LazyActivity.this.getSupportFragmentManager());
72+
public class MyFragmentPagerAdapter extends FragmentStateAdapter {
73+
74+
public MyFragmentPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
75+
super(fragmentActivity);
6976
}
7077

7178
@Override
72-
public Fragment getItem(int position) {
79+
public Fragment createFragment(int position) {
7380
return list.get(position);
7481
}
7582

7683
@Override
77-
public int getCount() {
84+
public int getItemCount() {
7885
return list.size();
7986
}
80-
81-
@Nullable
82-
@Override
83-
public CharSequence getPageTitle(int position) {
84-
return title[position];
85-
}
8687
}
88+
8789
}

sample/src/main/java/com/azhon/mvvm/lazy/LazyFragment.java

-5
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,6 @@ protected void lazyLoad() {
8080
viewModel.loadData(category);
8181
}
8282

83-
@Override
84-
protected void visibleToUser() {
85-
Log.e(TAG, "与用户可见 " + category);
86-
}
87-
8883
@Override
8984
public void onItemClick(JueJinBean.DBean.EntrylistBean bean, int position) {
9085
startActivity(new Intent(context, DetailActivity.class)

sample/src/main/res/layout/activity_lazy.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
android:layout_height="1dp"
2727
android:background="#eeeeee" />
2828

29-
<androidx.viewpager.widget.ViewPager
29+
<androidx.viewpager2.widget.ViewPager2
3030
android:id="@+id/view_pager"
3131
android:layout_width="match_parent"
3232
android:layout_height="0dp"
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<resources>
22
<string name="app_name">TODO-MVVM</string>
3-
<string name="introduce"> MVVM轻量快速开发框架:使用JetPack中的AndroidX + ViewModel + LiveData + DataBinding组件,同时使用RxJava2 + Retrofit2 + Glide等主流框架进行搭建</string>
3+
<string name="introduce"> MVVM轻量快速开发框架:使用JetPack中的AndroidX + ViewModel + LiveData + DataBinding组件,同时使用ViewPager2 + RxJava2 + Retrofit2 + Glide等主流框架进行搭建</string>
44
<string name="vm_hint"> 在当前页面开启屏幕自动旋转,旋转为横屏页面会重新创建;但是之前请求的数据依旧还在,这也许就是ViewModel的魅力所在。(manifest中没有配置android:configChanges)</string>
55
</resources>

0 commit comments

Comments
 (0)