Skip to content

Commit de69cc7

Browse files
committed
补充完善Fragment的adapter,修复加载更多的一个bug
1 parent 3b254da commit de69cc7

16 files changed

Lines changed: 211 additions & 273 deletions

File tree

listrelated/src/main/java/com/ai/listrelated/adapter/fragment/TabInFo.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ public class TabInFo {
1414
private final String tag; // tag
1515
private final Class<?> clss; // 类
1616
private final Bundle args; // 参数
17+
private final String title; // 标题
1718

18-
public TabInFo(String _tag, Class<?> _class, Bundle _args) {
19+
public TabInFo(String _tag, Class<?> _class, Bundle _args, String _title) {
1920
tag = _tag;
2021
clss = _class;
2122
args = _args;
23+
title = _title;
2224
}
2325

2426
public String getTag() {
@@ -33,4 +35,8 @@ public Bundle getArgs() {
3335
return args;
3436
}
3537

38+
public String getTitle() {
39+
return title;
40+
}
41+
3642
}

listrelated/src/main/java/com/ai/listrelated/adapter/fragment/v13/BaseFragmentAdapter.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.content.Context;
66
import android.os.Bundle;
77
import android.support.v13.app.FragmentPagerAdapter;
8+
import android.util.SparseArray;
89

910
import com.ai.listrelated.adapter.fragment.TabInFo;
1011

@@ -21,6 +22,7 @@ public class BaseFragmentAdapter extends FragmentPagerAdapter {
2122

2223
protected Context mContext;
2324
protected ArrayList<TabInFo> mTabInFos;
25+
protected SparseArray<Fragment> mFragments;
2426
protected FragmentManager mFragmentManager;
2527

2628
public BaseFragmentAdapter(FragmentManager fm, Context context) {
@@ -40,15 +42,24 @@ public String getFragmentName(int position) {
4042
return mTabInFos.get(position).getTag();
4143
}
4244

45+
/**
46+
* 添加一个Fragment
47+
*/
48+
public void addFragment(TabInFo info) {
49+
mTabInFos.add(info);
50+
notifyDataSetChanged();
51+
}
52+
4353
/**
4454
* 添加一个Fragment
4555
*
46-
* @param tag tag,名称
47-
* @param clss 类
48-
* @param args 参数
56+
* @param tag tag,名称
57+
* @param clss 类
58+
* @param args 参数
59+
* @param title 标题
4960
*/
50-
public void addFragment(String tag, Class<?> clss, Bundle args) {
51-
TabInFo info = new TabInFo(tag, clss, args);
61+
public void addFragment(String tag, Class<?> clss, Bundle args, String title) {
62+
TabInFo info = new TabInFo(tag, clss, args, title);
5263
mTabInFos.add(info);
5364
notifyDataSetChanged();
5465
}
@@ -72,14 +83,23 @@ public Fragment getFragment(int position) {
7283
@Override
7384
public Fragment getItem(int position) {
7485
TabInFo info = mTabInFos.get(position);
75-
return Fragment.instantiate(mContext, info.getClss().getName(), info.getArgs());
86+
Fragment fragment = mFragments.get(position);
87+
if (fragment == null) {
88+
fragment = Fragment.instantiate(mContext, info.getClss().getName(), info.getArgs());
89+
}
90+
return fragment;
7691
}
7792

7893
@Override
7994
public int getCount() {
8095
return mTabInFos.size();
8196
}
8297

98+
@Override
99+
public CharSequence getPageTitle(int position) {
100+
return mTabInFos.get(position).getTitle();
101+
}
102+
83103
/**
84104
* 为Fragment生成tag,名称
85105
*

listrelated/src/main/java/com/ai/listrelated/adapter/fragment/v4/BaseFragmentAdapter.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.support.v4.app.Fragment;
66
import android.support.v4.app.FragmentManager;
77
import android.support.v4.app.FragmentPagerAdapter;
8+
import android.util.SparseArray;
89

910
import com.ai.listrelated.adapter.fragment.TabInFo;
1011

@@ -21,13 +22,15 @@ public class BaseFragmentAdapter extends FragmentPagerAdapter {
2122

2223
protected Context mContext;
2324
protected ArrayList<TabInFo> mTabInFos;
25+
protected SparseArray<Fragment> mFragments;
2426
protected FragmentManager mFragmentManager;
2527

2628
public BaseFragmentAdapter(FragmentManager fm, Context context) {
2729
super(fm);
2830
mContext = context;
2931
mFragmentManager = fm;
3032
mTabInFos = new ArrayList<>();
33+
mFragments = new SparseArray<>();
3134
}
3235

3336
/**
@@ -40,15 +43,24 @@ public String getFragmentName(int position) {
4043
return mTabInFos.get(position).getTag();
4144
}
4245

46+
/**
47+
* 添加一个Fragment
48+
*/
49+
public void addFragment(TabInFo info) {
50+
mTabInFos.add(info);
51+
notifyDataSetChanged();
52+
}
53+
4354
/**
4455
* 添加一个Fragment
4556
*
46-
* @param tag tag,名称
47-
* @param clss 类
48-
* @param args 参数
57+
* @param tag tag,名称
58+
* @param clss 类
59+
* @param args 参数
60+
* @param title 标题
4961
*/
50-
public void addFragment(String tag, Class<?> clss, Bundle args) {
51-
TabInFo info = new TabInFo(tag, clss, args);
62+
public void addFragment(String tag, Class<?> clss, Bundle args, String title) {
63+
TabInFo info = new TabInFo(tag, clss, args, title);
5264
mTabInFos.add(info);
5365
notifyDataSetChanged();
5466
}
@@ -72,14 +84,24 @@ public Fragment getFragment(int position) {
7284
@Override
7385
public Fragment getItem(int position) {
7486
TabInFo info = mTabInFos.get(position);
75-
return Fragment.instantiate(mContext, info.getClss().getName(), info.getArgs());
87+
Fragment fragment = mFragments.get(position);
88+
if (fragment == null) {
89+
fragment = Fragment.instantiate(mContext, info.getClss().getName(), info.getArgs());
90+
mFragments.put(position, fragment);
91+
}
92+
return fragment;
7693
}
7794

7895
@Override
7996
public int getCount() {
8097
return mTabInFos.size();
8198
}
8299

100+
@Override
101+
public CharSequence getPageTitle(int position) {
102+
return mTabInFos.get(position).getTitle();
103+
}
104+
83105
/**
84106
* 为Fragment生成tag,名称
85107
*

listrelated/src/main/java/com/ai/listrelated/loadmore/LoadMoreContainerBase.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ public void setLoadMoreView(View view) {
104104
mFooterView = view;
105105
return;
106106
}
107-
// remove previous
108-
if (mFooterView != null && mFooterView != view) {
109-
removeFooterView(view);
110-
}
107+
// TODO: 2017/1/12 在最后的时候本来添加了可以移除所有数据加载完毕的item的,
108+
// TODO: 但是这样下拉刷新之后需要再次添加,但是现在没有更好的时机来添加。
109+
// // remove previous
110+
// if (mFooterView != null && mFooterView != view) {
111+
// removeFooterView(view);
112+
// }
111113
// add current
112114
mFooterView = view;
113115
mFooterView.setOnClickListener(new OnClickListener() {
@@ -134,7 +136,7 @@ public void loadMoreFinish(boolean hasMore) {
134136
mLoadError = false;
135137
mIsLoading = false;
136138
mHasMore = hasMore;
137-
if (!mHasMore && !mAllLoadFinishView && mFooterView != null) {
139+
if (!mHasMore && !mAllLoadFinishView) {
138140
removeFooterView(mFooterView);
139141
return;
140142
}

sample/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ dependencies {
2727
// optional
2828
// pull refresh
2929
compile 'in.srain.cube:ultra-ptr:1.0.11@aar'
30+
31+
compile 'com.android.support:design:25.1.0@aar'
32+
compile 'com.android.support:transition:25.1.0@aar'
3033
}

sample/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
</intent-filter>
1818
</activity>
1919
<activity android:name="com.ai.listrelated.sample.defaultimpl.DefaultRefreshLoadmoreActivity"/>
20-
<activity android:name="com.ai.listrelated.sample.loadmore.LoadmoreListActivity"/>
21-
<activity android:name="com.ai.listrelated.sample.loadmore.LoadmoreGridActivity"/>
2220
</application>
2321

2422
</manifest>

sample/src/main/java/com/ai/listrelated/sample/MainActivity.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import android.view.View;
88

99
import com.ai.listrelated.sample.defaultimpl.DefaultRefreshLoadmoreActivity;
10-
import com.ai.listrelated.sample.loadmore.LoadmoreGridActivity;
11-
import com.ai.listrelated.sample.loadmore.LoadmoreListActivity;
1210

1311
public class MainActivity extends AppCompatActivity {
1412

@@ -27,12 +25,4 @@ public void defaultImpl(View view) {
2725
startActivity(new Intent(this, DefaultRefreshLoadmoreActivity.class));
2826
}
2927

30-
public void loadmoreListView(View view) {
31-
startActivity(new Intent(this, LoadmoreListActivity.class));
32-
}
33-
34-
public void loadmoreGridView(View view) {
35-
startActivity(new Intent(this, LoadmoreGridActivity.class));
36-
}
37-
3828
}

sample/src/main/java/com/ai/listrelated/sample/customfooter/CusDefaultFooterView.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
import com.ai.listrelated.loadmore.iface.LoadMoreUIHandler;
1111
import com.ai.listrelated.sample.R;
1212

13+
/**
14+
* <b>Project:</b> ListRelated <br>
15+
* <b>Create Date:</b> 2017/1/8 <br>
16+
* <b>Author:</b> qy <br>
17+
* <b>Address:</b> qingyongai@gmail.com <br>
18+
* <b>Description:</b> 自定义加载更多界面,记得继承RelativeLayout,由于RecyclerView的测量问题 <br>
19+
*/
1320
public class CusDefaultFooterView extends RelativeLayout implements LoadMoreUIHandler {
1421

1522
private TextView mTextView;

sample/src/main/java/com/ai/listrelated/sample/defaultimpl/DefaultRefreshLoadmoreActivity.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.ai.listrelated.sample.defaultimpl;
22

33
import android.os.Bundle;
4+
import android.support.design.widget.TabLayout;
5+
import android.support.v4.view.ViewPager;
46
import android.support.v7.app.AppCompatActivity;
57
import android.support.v7.widget.Toolbar;
68

9+
import com.ai.listrelated.adapter.fragment.v4.BaseFragmentAdapter;
710
import com.ai.listrelated.sample.R;
811

912
/**
@@ -16,18 +19,38 @@
1619
public class DefaultRefreshLoadmoreActivity extends AppCompatActivity {
1720

1821
private Toolbar mToolbar;
22+
private ViewPager mViewPager;
23+
private TabLayout mTabLayout;
24+
private BaseFragmentAdapter mAdapter;
1925

2026
@Override
2127
protected void onCreate(Bundle savedInstanceState) {
2228
super.onCreate(savedInstanceState);
2329
setContentView(R.layout.act_base_layout);
2430
mToolbar = (Toolbar) findViewById(R.id.toolbar);
31+
mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
32+
mViewPager = (ViewPager) findViewById(R.id.view_pager);
2533
setSupportActionBar(mToolbar);
2634
mToolbar.setTitle("默认的实现");
35+
2736
// ListViewFragment fragment = ListViewFragment.getInstance(null);
2837
// GridViewFragment fragment = GridViewFragment.getInstance(null);
29-
RecyclerviewFragment fragment = RecyclerviewFragment.getInstance(null);
30-
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
38+
// RecyclerviewFragment fragment = RecyclerviewFragment.getInstance(null);
39+
// getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
40+
41+
mTabLayout.setTabMode(TabLayout.MODE_FIXED);
42+
43+
mAdapter = new BaseFragmentAdapter(getSupportFragmentManager(), this);
44+
mAdapter.addFragment(BaseFragmentAdapter.makeFragmentName(mViewPager.getId(), 0),
45+
ListViewFragment.class, null, "ListView示例");
46+
mAdapter.addFragment(BaseFragmentAdapter.makeFragmentName(mViewPager.getId(), 1),
47+
GridViewFragment.class, null, "GridView示例");
48+
mAdapter.addFragment(BaseFragmentAdapter.makeFragmentName(mViewPager.getId(), 2),
49+
RecyclerviewFragment.class, null, "Recyclerview示例");
50+
mViewPager.setOffscreenPageLimit(mAdapter.getCount());
51+
mViewPager.setAdapter(mAdapter);
52+
53+
mTabLayout.setupWithViewPager(mViewPager);
3154
}
3255

3356
}

sample/src/main/java/com/ai/listrelated/sample/defaultimpl/DividerItemDecoration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import android.support.v7.widget.RecyclerView;
1010
import android.view.View;
1111

12+
/**
13+
* 这个不是我写的,从别处拿来直接用的
14+
*/
1215
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
1316

1417
private static final int[] ATTRS = new int[]{

0 commit comments

Comments
 (0)