Skip to content

Commit 8c54ffd

Browse files
committed
feat: TabLayoutSupport Lib supports LoopViewPager
1 parent 194ad0a commit 8c54ffd

File tree

7 files changed

+177
-6
lines changed

7 files changed

+177
-6
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
android:name=".MaterialDemoActivity"
3333
android:theme="@style/Theme.DesignDemo">
3434
</activity>
35+
<activity
36+
android:name=".MaterialDemoWithLoopPagerActivity"
37+
android:theme="@style/Theme.DesignDemo">
38+
</activity>
3539
<activity
3640
android:name=".ReverseSingleFlingPagerActivity" >
3741
</activity>

app/src/main/java/com/lsjwzh/widget/recyclerviewpagerdeomo/MainActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ void onClick() {
6262
startActivity(new Intent(MainActivity.this, MaterialDemoActivity.class));
6363
}
6464
});
65+
mDemoListAdapter.add(new DemoItem("Material Demo With loop pager") {
66+
@Override
67+
void onClick() {
68+
startActivity(new Intent(MainActivity.this, MaterialDemoWithLoopPagerActivity.class));
69+
}
70+
});
6571
mDemoListAdapter.add(new DemoItem("Vertical ViewPager Demo") {
6672
@Override
6773
void onClick() {
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.lsjwzh.widget.recyclerviewpagerdeomo;
2+
3+
import java.util.LinkedHashMap;
4+
5+
import android.os.Bundle;
6+
import android.support.design.widget.TabLayout;
7+
import android.support.v4.app.Fragment;
8+
import android.support.v4.app.FragmentManager;
9+
import android.support.v7.app.AppCompatActivity;
10+
import android.support.v7.widget.LinearLayoutManager;
11+
import android.support.v7.widget.Toolbar;
12+
import android.util.Log;
13+
14+
import com.lsjwzh.widget.recyclerviewpager.FragmentStatePagerAdapter;
15+
import com.lsjwzh.widget.recyclerviewpager.LoopRecyclerViewPager;
16+
import com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager;
17+
import com.lsjwzh.widget.recyclerviewpager.TabLayoutSupport;
18+
19+
public class MaterialDemoWithLoopPagerActivity extends AppCompatActivity {
20+
protected LoopRecyclerViewPager mRecyclerView;
21+
private FragmentsAdapter mAdapter;
22+
23+
@Override
24+
protected void onCreate(Bundle savedInstanceState) {
25+
super.onCreate(savedInstanceState);
26+
setContentView(R.layout.demo_material_loop_pager);
27+
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
28+
initViewPager();
29+
initTabLayout();
30+
31+
}
32+
33+
private void initTabLayout() {
34+
//给TabLayout增加Tab, 并关联ViewPager
35+
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
36+
TabLayoutSupport.setupWithViewPager(tabLayout, mRecyclerView, mAdapter);
37+
}
38+
39+
protected void initViewPager() {
40+
mRecyclerView = (LoopRecyclerViewPager) findViewById(R.id.viewpager);
41+
LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
42+
false);
43+
mRecyclerView.setLayoutManager(layout);
44+
mAdapter = new FragmentsAdapter(getSupportFragmentManager());
45+
mRecyclerView.setAdapter(mAdapter);
46+
mRecyclerView.setHasFixedSize(true);
47+
mRecyclerView.setLongClickable(true);
48+
mRecyclerView.addItemDecoration(new SpacesItemDecoration(50, mRecyclerView.getAdapter().getItemCount()));
49+
mRecyclerView.addOnPageChangedListener(new RecyclerViewPager.OnPageChangedListener() {
50+
@Override
51+
public void OnPageChanged(int oldPosition, int newPosition) {
52+
Log.d("test", "oldPosition:" + oldPosition + " newPosition:" + newPosition);
53+
}
54+
});
55+
56+
}
57+
58+
59+
class FragmentsAdapter extends FragmentStatePagerAdapter implements TabLayoutSupport.ViewPagerTabLayoutAdapter {
60+
LinkedHashMap<Integer, Fragment> mFragmentCache = new LinkedHashMap<>();
61+
62+
public FragmentsAdapter(FragmentManager fm) {
63+
super(fm);
64+
}
65+
66+
@Override
67+
public Fragment getItem(int position, Fragment.SavedState savedState) {
68+
Fragment f = mFragmentCache.containsKey(position) ? mFragmentCache.get(position)
69+
: new CheeseListFragment();
70+
Log.e("test", "getItem:" + position + " from cache" + mFragmentCache.containsKey
71+
(position));
72+
if (savedState == null || f.getArguments() == null) {
73+
Bundle bundle = new Bundle();
74+
bundle.putInt("index", position);
75+
f.setArguments(bundle);
76+
Log.e("test", "setArguments:" + position);
77+
} else if (!mFragmentCache.containsKey(position)) {
78+
f.setInitialSavedState(savedState);
79+
Log.e("test", "setInitialSavedState:" + position);
80+
}
81+
mFragmentCache.put(position, f);
82+
return f;
83+
}
84+
85+
@Override
86+
public void onDestroyItem(int position, Fragment fragment) {
87+
// onDestroyItem
88+
while (mFragmentCache.size() > 5) {
89+
Object[] keys = mFragmentCache.keySet().toArray();
90+
mFragmentCache.remove(keys[0]);
91+
}
92+
}
93+
94+
@Override
95+
public String getPageTitle(int position) {
96+
return "item-" + position;
97+
}
98+
99+
@Override
100+
public int getItemCount() {
101+
return 10;
102+
}
103+
}
104+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<android.support.design.widget.CoordinatorLayout
4+
android:id="@+id/main_content"
5+
xmlns:android="http://schemas.android.com/apk/res/android"
6+
xmlns:app="http://schemas.android.com/apk/res-auto"
7+
android:layout_width="match_parent"
8+
android:layout_height="match_parent"
9+
android:fitsSystemWindows="true">
10+
11+
<android.support.design.widget.AppBarLayout
12+
android:id="@+id/appbar"
13+
android:layout_width="match_parent"
14+
android:layout_height="wrap_content"
15+
android:background="?attr/colorPrimary"
16+
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
17+
18+
<android.support.v7.widget.Toolbar
19+
android:id="@+id/toolbar"
20+
android:layout_width="match_parent"
21+
android:layout_height="?attr/actionBarSize"
22+
android:background="?attr/colorPrimary"
23+
app:layout_scrollFlags="scroll|enterAlways" />
24+
25+
<android.support.design.widget.TabLayout
26+
android:id="@+id/tabs"
27+
android:layout_width="match_parent"
28+
android:layout_height="wrap_content"
29+
app:tabGravity="fill"
30+
app:tabMode="scrollable"/>
31+
</android.support.design.widget.AppBarLayout>
32+
33+
<com.lsjwzh.widget.recyclerviewpager.LoopRecyclerViewPager
34+
android:id="@+id/viewpager"
35+
android:layout_width="match_parent"
36+
android:layout_height="match_parent"
37+
android:clipToPadding="false"
38+
app:rvp_singlePageFling="false"
39+
app:rvp_triggerOffset="0.1"
40+
app:layout_behavior="@string/appbar_scrolling_view_behavior"
41+
/>
42+
43+
</android.support.design.widget.CoordinatorLayout>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
~ See the License for the specific language governing permissions and
1515
~ limitations under the License.
1616
-->
17-
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
18-
android:id="@+id/recyclerview"
19-
android:layout_width="match_parent"
20-
android:layout_height="match_parent" />
17+
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview"
18+
xmlns:android="http://schemas.android.com/apk/res/android"
19+
android:layout_width="match_parent"
20+
android:layout_height="match_parent"/>

lib/src/main/java/com/lsjwzh/widget/recyclerviewpager/LoopRecyclerViewPager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ public void scrollToPosition(int position) {
6767
*/
6868
public int getActualCurrentPosition() {
6969
int position = getCurrentPosition();
70+
return transformToActualPosition(position);
71+
}
72+
73+
public int transformToActualPosition(int position) {
7074
return position % getActualItemCountFromAdpater();
7175
}
7276

tablayoutsupport/src/main/java/com/lsjwzh/widget/recyclerviewpager/TabLayoutSupport.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public static void setupWithViewPager(@NonNull TabLayout tabLayout
1919
for (int count = viewPagerTabLayoutAdapter.getItemCount(); i < count; ++i) {
2020
tabLayout.addTab(tabLayout.newTab().setText(viewPagerTabLayoutAdapter.getPageTitle(i)));
2121
}
22-
final TabLayoutOnPageChangeListener listener = new TabLayoutOnPageChangeListener(tabLayout);
22+
final TabLayoutOnPageChangeListener listener
23+
= new TabLayoutOnPageChangeListener(tabLayout, viewPager);
2324
viewPager.addOnScrollListener(listener);
2425
viewPager.addOnPageChangedListener(listener);
2526
tabLayout.setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
@@ -52,11 +53,13 @@ public void onTabReselected(TabLayout.Tab tab) {
5253
public static class TabLayoutOnPageChangeListener extends RecyclerView.OnScrollListener implements RecyclerViewPager
5354
.OnPageChangedListener {
5455
private final WeakReference<TabLayout> mTabLayoutRef;
56+
private final WeakReference<RecyclerViewPager> mViewPagerRef;
5557
private int mPositionBeforeScroll;
5658
private int mPagerLeftBeforeScroll;
5759

58-
public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
60+
public TabLayoutOnPageChangeListener(TabLayout tabLayout, RecyclerViewPager viewPager) {
5961
this.mTabLayoutRef = new WeakReference<>(tabLayout);
62+
this.mViewPagerRef = new WeakReference<>(viewPager);
6063
}
6164

6265
@Override
@@ -102,6 +105,13 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
102105

103106
@Override
104107
public void OnPageChanged(int oldPosition, int newPosition) {
108+
if (mViewPagerRef.get() == null) {
109+
return;
110+
}
111+
if (mViewPagerRef.get() instanceof LoopRecyclerViewPager) {
112+
newPosition = ((LoopRecyclerViewPager) mViewPagerRef.get())
113+
.transformToActualPosition(newPosition);
114+
}
105115
TabLayout tabLayout = this.mTabLayoutRef.get();
106116
if (tabLayout != null && tabLayout.getTabAt(newPosition) != null) {
107117
tabLayout.getTabAt(newPosition).select();

0 commit comments

Comments
 (0)