Skip to content

Commit 34fceea

Browse files
committed
ViewPager2替换ViewPager
1 parent 9ead496 commit 34fceea

File tree

5 files changed

+109
-107
lines changed

5 files changed

+109
-107
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ Model-View-ViewModel,View 指绿色的 Activity/Fragment,主要负责界面
8484
Glide相比起Fresco要轻量很多,api调用起来也很简洁,对图片加载要求不是很高的话建议使用Glide。
8585

8686
# 更新日志
87+
### v2.5
88+
* 使用ViewPager2替换ViewPager
8789
### v2.4
8890
* 接入Paging3改写Paging2繁琐的分页代码,Paging3提供了刷新、重试等惊喜功能
8991
### v2.3

app/src/main/java/com/fmt/github/base/fragment/BaseVMFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.fmt.github.base.fragment
22

33
import android.content.Context
44
import android.os.Bundle
5+
import android.util.Log
56
import android.view.LayoutInflater
67
import android.view.View
78
import android.view.ViewGroup
@@ -41,7 +42,7 @@ abstract class BaseVMFragment : Fragment() {
4142
savedInstanceState: Bundle?
4243
): View? {
4344
if (mRootView == null) {
44-
mRootView = View.inflate(container?.context, getLayoutRes(), null)
45+
mRootView = View.inflate(mActivity, getLayoutRes(), null)
4546
}
4647
return mRootView
4748
}

app/src/main/java/com/fmt/github/user/activity/UserInfoActivity.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ import android.content.Intent
55
import android.view.View
66
import androidx.core.app.ActivityOptionsCompat
77
import androidx.fragment.app.Fragment
8-
import androidx.fragment.app.FragmentStatePagerAdapter
98
import com.fmt.github.R
109
import com.fmt.github.base.activity.BaseDataBindActivity
1110
import com.fmt.github.databinding.ActivityUserInfoBinding
1211
import com.fmt.github.user.adapter.UserInfoPagerAdapter
1312
import com.fmt.github.user.fragment.UserInfoFragment
1413
import com.fmt.github.user.fragment.UserReposFragment
1514
import com.fmt.github.user.model.UserModel
15+
import com.google.android.material.tabs.TabLayoutMediator
1616
import kotlinx.android.synthetic.main.activity_user_info.*
1717

1818
class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
1919

20+
private val mTitles = listOf("Info", "Repos", "Favor")
21+
2022
lateinit var mUserModel: UserModel
2123

2224
companion object {
@@ -50,14 +52,14 @@ class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
5052
add(UserInfoFragment())
5153
add(UserReposFragment.newInstance(mUserModel.login))
5254
add(UserReposFragment.newInstance(mUserModel.login, true))
53-
}.apply {
54-
mViewPager.adapter = UserInfoPagerAdapter(
55-
supportFragmentManager, this,
56-
FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
57-
)
58-
mViewPager.offscreenPageLimit = 2
59-
mTabLayout.setupWithViewPager(mViewPager)
55+
}.also { fragmentList ->
56+
mViewPager.adapter = UserInfoPagerAdapter(this, fragmentList)
6057
}
58+
//绑定TabLayout和ViewPager2
59+
TabLayoutMediator(mTabLayout, mViewPager,
60+
TabLayoutMediator.TabConfigurationStrategy { tab, position ->
61+
tab.text = mTitles[position]
62+
}).attach()
6163
}
6264

6365
override fun onBackPressed() {
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package com.fmt.github.user.adapter
22

33
import androidx.fragment.app.Fragment
4-
import androidx.fragment.app.FragmentManager
5-
import androidx.fragment.app.FragmentStatePagerAdapter
4+
import androidx.fragment.app.FragmentActivity
5+
import androidx.viewpager2.adapter.FragmentStateAdapter
66

77
class UserInfoPagerAdapter(
8-
fm: FragmentManager,
9-
private val mFragmentList: List<Fragment>,
10-
behavior: Int
11-
) : FragmentStatePagerAdapter(fm, behavior) {//Behavior实现Fragment的懒加载
8+
fragmentActivity: FragmentActivity,
9+
private val mFragmentList: List<Fragment>
10+
) : FragmentStateAdapter(fragmentActivity) {//FragmentStateAdapter在Fragment可见时进入onResume,不可间时进入onStart
1211

13-
private val mTitles = listOf("Info", "Repos", "Favor")
12+
override fun getItemCount(): Int = mFragmentList.size
1413

15-
override fun getItem(position: Int): Fragment = mFragmentList[position]
16-
17-
override fun getCount(): Int = mFragmentList.size
18-
19-
override fun getPageTitle(position: Int): CharSequence = mTitles[position]
14+
override fun createFragment(position: Int): Fragment = mFragmentList[position]
2015
}

app/src/main/res/layout/activity_user_info.xml

Lines changed: 88 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,125 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<layout
3-
xmlns:android="http://schemas.android.com/apk/res/android"
4-
xmlns:app="http://schemas.android.com/apk/res-auto">
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
54

65
<data>
7-
<variable name="userModel" type="com.fmt.github.user.model.UserModel"/>
6+
7+
<variable
8+
name="userModel"
9+
type="com.fmt.github.user.model.UserModel" />
810
</data>
911

1012
<androidx.coordinatorlayout.widget.CoordinatorLayout
13+
android:layout_width="match_parent"
14+
android:layout_height="match_parent"
15+
android:fitsSystemWindows="true">
16+
17+
<com.google.android.material.appbar.AppBarLayout
18+
android:id="@+id/app_bar"
1119
android:layout_width="match_parent"
12-
android:layout_height="match_parent"
20+
android:layout_height="wrap_content"
1321
android:fitsSystemWindows="true">
1422

15-
<com.google.android.material.appbar.AppBarLayout
16-
android:id="@+id/app_bar"
23+
<com.google.android.material.appbar.CollapsingToolbarLayout
1724
android:layout_width="match_parent"
1825
android:layout_height="wrap_content"
19-
android:fitsSystemWindows="true">
26+
app:contentScrim="@color/colorPrimary"
27+
app:layout_scrollFlags="scroll|exitUntilCollapsed">
2028

21-
<com.google.android.material.appbar.CollapsingToolbarLayout
29+
<LinearLayout
2230
android:layout_width="match_parent"
2331
android:layout_height="wrap_content"
24-
app:layout_scrollFlags="scroll|exitUntilCollapsed"
25-
app:contentScrim="@color/colorPrimary">
26-
27-
<LinearLayout
28-
android:layout_width="match_parent"
29-
android:layout_height="wrap_content"
30-
android:orientation="vertical"
31-
android:paddingTop="190dp"
32-
android:paddingBottom="40dp"
33-
android:layout_gravity="center|top"
34-
android:layout_marginLeft="16dp"
35-
android:layout_marginRight="16dp"
36-
android:gravity="center">
32+
android:layout_gravity="center|top"
33+
android:layout_marginLeft="16dp"
34+
android:layout_marginRight="16dp"
35+
android:gravity="center"
36+
android:orientation="vertical"
37+
android:paddingTop="190dp"
38+
android:paddingBottom="40dp">
3739

3840
<TextView
39-
android:layout_width="wrap_content"
40-
android:layout_height="wrap_content"
41-
android:text="HI!"
42-
android:textStyle="bold"
43-
android:textColor="@android:color/white"
44-
android:textSize="30sp"/>
41+
android:layout_width="wrap_content"
42+
android:layout_height="wrap_content"
43+
android:text="HI!"
44+
android:textColor="@android:color/white"
45+
android:textSize="30sp"
46+
android:textStyle="bold" />
4547

4648
<TextView
47-
android:id="@+id/mIntroduceTv"
48-
android:layout_width="match_parent"
49-
android:layout_height="wrap_content"
50-
android:layout_marginTop="16dp"
51-
android:gravity="center"
52-
android:textSize="16sp"
53-
android:textColor="@android:color/white"
54-
android:text="@{@string/introduce(userModel.login)}"/>
49+
android:id="@+id/mIntroduceTv"
50+
android:layout_width="match_parent"
51+
android:layout_height="wrap_content"
52+
android:layout_marginTop="16dp"
53+
android:gravity="center"
54+
android:text="@{@string/introduce(userModel.login)}"
55+
android:textColor="@android:color/white"
56+
android:textSize="16sp" />
5557

5658
</LinearLayout>
5759

5860
<androidx.appcompat.widget.Toolbar
59-
android:id="@+id/mToolbar"
60-
android:layout_width="match_parent"
61-
android:layout_height="?attr/actionBarSize"
62-
app:navigationIcon="@mipmap/icon_back"
63-
app:layout_collapseMode="pin"/>
61+
android:id="@+id/mToolbar"
62+
android:layout_width="match_parent"
63+
android:layout_height="?attr/actionBarSize"
64+
app:layout_collapseMode="pin"
65+
app:navigationIcon="@mipmap/icon_back" />
6466

6567
</com.google.android.material.appbar.CollapsingToolbarLayout>
6668

6769

6870
<com.google.android.material.tabs.TabLayout
69-
android:id="@+id/mTabLayout"
70-
android:layout_width="match_parent"
71-
android:layout_height="wrap_content"
72-
app:tabBackground="@color/colorPrimary"
73-
app:tabTextColor="@android:color/white"
74-
app:tabIndicatorColor="@android:color/white"
75-
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"/>
71+
android:id="@+id/mTabLayout"
72+
android:layout_width="match_parent"
73+
android:layout_height="wrap_content"
74+
app:tabBackground="@color/colorPrimary"
75+
app:tabIndicatorColor="@android:color/white"
76+
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
77+
app:tabTextColor="@android:color/white" />
7678

7779
</com.google.android.material.appbar.AppBarLayout>
7880

79-
<androidx.viewpager.widget.ViewPager
80-
android:id="@+id/mViewPager"
81-
android:layout_width="match_parent"
82-
android:layout_height="match_parent"
83-
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
81+
<androidx.viewpager2.widget.ViewPager2
82+
android:id="@+id/mViewPager"
83+
android:layout_width="match_parent"
84+
android:layout_height="match_parent"
85+
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
8486

8587
<de.hdodenhof.circleimageview.CircleImageView
86-
android:id="@+id/mUserIconIv"
87-
android:layout_width="120dp"
88-
android:layout_height="120dp"
89-
android:layout_gravity="center|top"
90-
android:layout_marginTop="50dp"
91-
android:elevation="10dp"
92-
app:layout_behavior="@string/simple_view_behavior"
93-
app:behavior_dependsOn="@+id/app_bar"
94-
app:behavior_dependType="y"
95-
app:behavior_dependTarget="-176dp"
96-
app:behavior_targetX="50dp"
97-
app:behavior_targetY="8dp"
98-
app:behavior_targetWidth="40dp"
99-
app:behavior_targetHeight="40dp"
100-
android:transitionName="image"
101-
app:url="@{userModel.avatar_url}"/>
88+
android:id="@+id/mUserIconIv"
89+
android:layout_width="120dp"
90+
android:layout_height="120dp"
91+
android:layout_gravity="center|top"
92+
android:layout_marginTop="50dp"
93+
android:elevation="10dp"
94+
android:transitionName="image"
95+
app:behavior_dependTarget="-176dp"
96+
app:behavior_dependType="y"
97+
app:behavior_dependsOn="@+id/app_bar"
98+
app:behavior_targetHeight="40dp"
99+
app:behavior_targetWidth="40dp"
100+
app:behavior_targetX="50dp"
101+
app:behavior_targetY="8dp"
102+
app:layout_behavior="@string/simple_view_behavior"
103+
app:url="@{userModel.avatar_url}" />
102104

103105
<TextView
104-
android:id="@+id/mUserNameTv"
105-
android:layout_width="wrap_content"
106-
android:layout_height="?attr/actionBarSize"
107-
android:text="@{userModel.login}"
108-
android:textSize="18sp"
109-
android:elevation="10dp"
110-
android:layout_marginStart="96dp"
111-
android:layout_marginTop="-100dp"
112-
android:gravity="center_vertical"
113-
android:textColor="@android:color/white"
114-
android:alpha="0"
115-
app:layout_behavior="@string/simple_view_behavior"
116-
app:behavior_dependsOn="@+id/app_bar"
117-
app:behavior_dependType="y"
118-
app:behavior_dependTarget="-206dp"
119-
app:behavior_targetY="0dp"
120-
app:behavior_targetAlpha="1"/>
106+
android:id="@+id/mUserNameTv"
107+
android:layout_width="wrap_content"
108+
android:layout_height="?attr/actionBarSize"
109+
android:layout_marginStart="96dp"
110+
android:layout_marginTop="-100dp"
111+
android:alpha="0"
112+
android:elevation="10dp"
113+
android:gravity="center_vertical"
114+
android:text="@{userModel.login}"
115+
android:textColor="@android:color/white"
116+
android:textSize="18sp"
117+
app:behavior_dependTarget="-206dp"
118+
app:behavior_dependType="y"
119+
app:behavior_dependsOn="@+id/app_bar"
120+
app:behavior_targetAlpha="1"
121+
app:behavior_targetY="0dp"
122+
app:layout_behavior="@string/simple_view_behavior" />
121123

122124

123125
</androidx.coordinatorlayout.widget.CoordinatorLayout>

0 commit comments

Comments
 (0)