Skip to content

Commit

Permalink
1、使用ViewPager2实现懒加载 2、更新项目配置
Browse files Browse the repository at this point in the history
  • Loading branch information
azhon committed Mar 25, 2020
1 parent 6c563ad commit 8a2cf57
Show file tree
Hide file tree
Showing 11 changed files with 38 additions and 91 deletions.
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@
### 介绍:

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

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

### Demo下载体验

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

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

### 项目编译

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

### 使用步骤

Expand Down
4 changes: 3 additions & 1 deletion basicLib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@ dependencies {
api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
api 'io.reactivex.rxjava2:rxjava:2.1.16'
api 'io.reactivex.rxjava2:rxandroid:2.0.2'
api 'androidx.recyclerview:recyclerview:1.0.0'
api 'androidx.recyclerview:recyclerview:1.1.0'
api 'com.github.bumptech.glide:glide:4.9.0'
api 'com.android.support:design:28.0.0'
api 'androidx.appcompat:appcompat:1.1.0'
api 'androidx.constraintlayout:constraintlayout:1.1.3'
api 'androidx.viewpager2:viewpager2:1.0.0'
api 'com.google.android.material:material:1.1.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
Expand Down
63 changes: 5 additions & 58 deletions basicLib/src/main/java/com/azhon/basic/base/BaseLazyFragment.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
package com.azhon.basic.base;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.LifecycleObserver;

import com.azhon.basic.lifecycle.BaseViewModel;

Expand All @@ -22,57 +16,15 @@
*/

public abstract class BaseLazyFragment<VM extends BaseViewModel, DB extends ViewDataBinding>
extends BaseFragment<VM, DB> {

/**
* 懒加载
*/
private boolean createView, activityCreated, lazy;
/**
* 这个Fragment是不是tab页面的第一个页面
*/
private boolean isFirstTab;
extends BaseFragment<VM, DB> implements LifecycleObserver {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
createView = true;
return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
activityCreated = true;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && createView && activityCreated && !lazy) {
//不是第一个Tab的Fragment 进行懒加载请求数据
lazy = true;
lazyLoad();
} else if (isVisibleToUser && !createView && !activityCreated && !lazy) {
//这个Fragment是多个Tab中的第一个
isFirstTab = true;
} else {
//对用户可见时,是否需要重新刷新数据
if (isVisibleToUser) {
visibleToUser();
}
}
}
private boolean visibleToUser;

@Override
public void onResume() {
super.onResume();
/**
* 第一个Tab页面懒加载
*/
if (isFirstTab && !lazy) {
lazy = true;
if (!visibleToUser) {
visibleToUser = true;
lazyLoad();
}
}
Expand All @@ -81,9 +33,4 @@ public void onResume() {
* 懒加载,只有在Fragment第一次创建且第一次对用户可见
*/
protected abstract void lazyLoad();

/**
* 每次在Fragment与用户可见状态且不是第一次对用户可见
*/
protected abstract void visibleToUser();
}
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ buildscript {

}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0-alpha01'
classpath 'com.android.tools.build:gradle:3.6.1'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Oct 30 13:16:57 CST 2019
#Wed Mar 25 22:55:36 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
Binary file modified img/img_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed img/img_code.png
Binary file not shown.
38 changes: 20 additions & 18 deletions sample/src/main/java/com/azhon/mvvm/lazy/LazyActivity.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package com.azhon.mvvm.lazy;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import com.azhon.basic.base.BaseNoModelActivity;
import com.azhon.mvvm.R;
import com.azhon.mvvm.databinding.ActivityLazyBinding;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -36,7 +38,7 @@ protected int onCreate() {
@Override
protected void initView() {
setTitle("Fragment懒加载使用示例");
ViewPager viewPager = dataBinding.viewPager;
ViewPager2 viewPager = dataBinding.viewPager;
TabLayout tabLayout = dataBinding.tabLayout;

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

MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter();
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(this);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabsFromPagerAdapter(adapter);
new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
tab.setText(title[position]);
}
}).attach();

}

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

}

private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter() {
super(LazyActivity.this.getSupportFragmentManager());
public class MyFragmentPagerAdapter extends FragmentStateAdapter {

public MyFragmentPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}

@Override
public Fragment getItem(int position) {
public Fragment createFragment(int position) {
return list.get(position);
}

@Override
public int getCount() {
public int getItemCount() {
return list.size();
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
return title[position];
}
}

}
5 changes: 0 additions & 5 deletions sample/src/main/java/com/azhon/mvvm/lazy/LazyFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,6 @@ protected void lazyLoad() {
viewModel.loadData(category);
}

@Override
protected void visibleToUser() {
Log.e(TAG, "与用户可见 " + category);
}

@Override
public void onItemClick(JueJinBean.DBean.EntrylistBean bean, int position) {
startActivity(new Intent(context, DetailActivity.class)
Expand Down
2 changes: 1 addition & 1 deletion sample/src/main/res/layout/activity_lazy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
android:layout_height="1dp"
android:background="#eeeeee" />

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

0 comments on commit 8a2cf57

Please sign in to comment.