說明
上篇寫了一個demo乐埠,這篇來看看使用。
提供了一個獲取tab標(biāo)簽頁的接口静盅,課程界面
分析
- 因?yàn)橹惶峁┝艘粋€接口究流,所以毫無疑問用戶的頻道喜好是存儲在本地的
- 因?yàn)槲以陬l道頁我的頻道點(diǎn)擊某個標(biāo)簽回到viewpager頁時(shí)需對應(yīng)那個界面,所以可以必須返回一個position
- 還需要頻道界面給我我的頻道以及其他頻道數(shù)據(jù)
處理
每次進(jìn)入到課程界面的時(shí)候請求到數(shù)據(jù)榆纽,與儲存的我的頻道數(shù)據(jù)比較仰猖,取交集,作為顯示的標(biāo)簽頁奈籽,剩余標(biāo)簽存做其他頻道待進(jìn)入頻道管理界面時(shí)傳入
代碼
進(jìn)入課程界面饥侵,請求網(wǎng)絡(luò)數(shù)據(jù),然后與本地保存做比較
String myItemsStr = (String) get(mContext, SPKey.MyItem, "");
myItems = gson.fromJson(myItemsStr,
new TypeToken<List<DataCommon>>() {
}.getType());
這個用于獲取用戶退出界面時(shí)保存在SharedPreferences里的我的頻道數(shù)據(jù)衣屏,因?yàn)檫@是復(fù)雜對象躏升,故,使用gson轉(zhuǎn)換狼忱。
if (null != myItems) {
List<DataCommon> temp = new ArrayList<>();
for (DataCommon dataCommon : myItems) {
if (mDataCommonList.contains(dataCommon)) {
temp.add(dataCommon);
}
}
這個是取交集的方法膨疏,給一個臨時(shí)變量temp存儲我的頻道數(shù)據(jù)
List<DataCommon> tempOther = new ArrayList<>();
for (DataCommon dataCommon : mDataCommonList) {
if (!temp.contains(dataCommon)) {
tempOther.add(dataCommon);
}
}
不在交集里的均為其他頻道,給臨時(shí)變量tempOther
mDataCommonList = temp;
mOtherCommonList = tempOther;
將臨時(shí)變量賦值給mDataCommonList一睁,mOtherCommonList。這兩個數(shù)據(jù)將作為我的頻道以及其他頻道數(shù)據(jù)傳給頻道界面佃却。
Intent intent = new Intent(mContext, ChannelActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(ChannelActivity.TAG_ITEM_MY, (Serializable) mDataCommonList);
bundle.putSerializable(ChannelActivity.TAG_ITEM_OTHER, (Serializable) mOtherCommonList);
intent.putExtras(bundle);
startActivityForResult(intent, CODE_REQUEST_CHANNEL);
這個是跳轉(zhuǎn)到頻道界面的操作者吁。這里有一個對象序列化操作,Serializable雖然差點(diǎn)但是方便點(diǎn)暫且先用它里双霍。然后用的startActivityForResult砚偶,這個是方便頻道選好之后帶數(shù)據(jù)回到這個界面。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (CODE_REQUEST_CHANNEL == requestCode && data != null && resultCode == RESULT_OK) {
mDataCommonList = (List<DataCommon>) data.getExtras().getSerializable(ChannelActivity.TAG_ITEM_MY);
mOtherCommonList = (List<DataCommon>) data.getExtras().getSerializable(ChannelActivity.TAG_ITEM_OTHER);
mPosition = data.getExtras().getInt(ChannelActivity.TAG_ITEM_POSITION, 0);
initPage();
}
}
選完頻道后回到課程界面洒闸,帶回的數(shù)據(jù)有mDataCommonList染坯,mOtherCommonList,mPosition丘逸。mPosition就是上文所說返回時(shí)須為對應(yīng)標(biāo)簽頁所用单鹿。
再來看看初始化viewpage操作
private void initPage() {
if (listFragments == null) {
listFragments = new ArrayList<>();
} else {
listFragments.clear();
}
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < mDataCommonList.size(); i++) {
list.add(mDataCommonList.get(i).name);
CourseListPage courseListFragment = new CourseListPage();
Bundle args = new Bundle();
args.putInt(CourseListPage.TAG_CODE, mDataCommonList.get(i).code);
courseListFragment.setArguments(args);
listFragments.add(courseListFragment);
}
int size = list.size();
mTitles = list.toArray(new String[size]);
// 初始化ViewPager的適配器,并設(shè)置給它
mDetailFMViewPagerAdapter = new ViewPagerFMAdapter(getChildFragmentManager(), mTitles, listFragments);
mAllViewpager.setAdapter(mDetailFMViewPagerAdapter);
// 設(shè)置ViewPager最大緩存的頁面?zhèn)€數(shù)
mAllViewpager.setOffscreenPageLimit(3);
// 設(shè)置ViewPager標(biāo)簽樣式
mAllTablayout.setTabMode(TabLayout.MODE_FIXED);
// 將TabLayout和ViewPager進(jìn)行關(guān)聯(lián)深纲,讓兩者聯(lián)動起來
mAllTablayout.setupWithViewPager(mAllViewpager);
mAllTablayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//跳轉(zhuǎn)目錄
mAllViewpager.setCurrentItem(mPosition);
}
listFragments不為null就clear仲锄,為null就new一個。這里list轉(zhuǎn)數(shù)組是為顯示標(biāo)簽頭湃鹊。for循環(huán)里創(chuàng)建fragment 儒喊,用bundle把code值帶入,因?yàn)楹竺鎓ragment數(shù)據(jù)請求币呵,傳入的參數(shù)為code怀愧。
后面viewpager相關(guān)操作就是將TabLayout和ViewPager進(jìn)行關(guān)聯(lián),讓兩者聯(lián)動起來等等余赢,看注釋即可芯义。這里說下ViewPagerFMAdapter繼承FragmentStatePagerAdapter,并且復(fù)寫getItemPosition妻柒,并renturn POSITION_NONE扛拨,不然頻道界面回到課程界面時(shí),fragment沒變化举塔。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
然后用戶退出這個界面時(shí)绑警,需把用戶喜好的頻道保存到SharedPreferences
/**
* 把用戶喜好的頻道保存到sp
*/
private void spSave() {
String curCommons = gson.toJson(mDataCommonList);
String oldCommons = (String) SPUtil.get(mContext, SPKey.MyItem, "");
if (!curCommons.equals(oldCommons)) {
SPUtil.put(mContext, SPKey.MyItem, gson.toJson(mDataCommonList));
}
}
為了避免無用重復(fù)保存,我們做個判斷央渣,只有當(dāng)前我的頻道和進(jìn)來時(shí)的不一樣才做保存待秃,否則不必保存,SharedPreferences不能直接保存list對象痹屹,gson.toJson(mDataCommonList)轉(zhuǎn)為字符串保存章郁,回頭獲取的時(shí)候在gson.fromJson(myItemsStr, new TypeToken<List<DataCommon>>() {}.getType());轉(zhuǎn)為list對象即可。
弊端
因?yàn)橹皇褂昧艘粋€接口,這樣用戶卸載了app他的喜好就say byebye了暖庄,還一種聊替,我在別的地方登錄我的賬號也是沒有我的喜好的頻道了。