ViewPager的重新整理、限制預先載入、緩衝所有,viewpager緩衝

來源:互聯網
上載者:User

ViewPager的重新整理、限制預先載入、緩衝所有,viewpager緩衝

【架構】:

公用部分:左側菜單、TitleBar、RadioGroup(3個RadioButton:X、Y、Z)

選擇X頁面:指標+ViewPager

 

【要達成的效果】:

(1)左側選擇A,進入X頁面,X1連網重新整理頁面,此時禁止X2預先載入—>滑動到X2頁面,X2才連網重新整理—>X3—>X4;

(2)從X4再滑到X3、X2、X1時,X1、X2、X3不需要再次重新整理,假設停留在X2頁面;

(3)左側再點選擇B,或者先點Y再點選擇B再點X,這時候X2連網重新整理;

(4)X2頁面滑到X1、X3、X4頁面,X1、X3、X4重新重新整理一次並緩衝。

 

【需要解決的幾個問題及說明】:

需要解決:

(1)ViewPager的Fragment重新整理問題

(2)禁止ViewPager的預先載入問題

(3)載入後即緩衝,除非再次連網請求

說明:

因為抽取了BaseFragment、連網載入頁面LoadingPage等,代碼結構有點複雜,這裡只摘取跟本文相關的代碼

 

【1】重新整理問題

initData初始化:
fManager=getChildFragmentManager();
adapter = new MyViewPagerAdapter(fManager,fenleiFragments);
vpSearch.setAdapter(adapter);
vpSearch.setOffscreenPageLimit(fenleiFragments.size()-1);//設定緩衝所有

FragmentPagerAdapter:
class MyViewPagerAdapter extends FragmentPagerAdapter {

private ArrayList<Fragment> fragments;
private FragmentManager manager;
private int mChildCount=0;

public MyViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fenleiFragments) {
super(fm);
this.manager=fm;
this.fragments=fenleiFragments;
}

@Override
public void notifyDataSetChanged() {
mChildCount=getCount();
super.notifyDataSetChanged();
}

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

@Override
public int getCount() {
return fenleiFragments == null ? 0 : fenleiFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {
return fenlei_names.get(position);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}

@Override
public int getItemPosition(Object object) {
//方式1:
if(mChildCount>0){
mChildCount--;
return POSITION_NONE;
}
return super.getItemPosition(object);

//方式2:
//return POSITION_NONE;

/*備忘:方式1和方式2在只有3個Fragment的情況下,效果一樣,多於3個的情況沒有驗證*/
}

}

 收到廣播重新整理

左側菜單更換選擇,重新整理菜單更換選擇、等等,這裡用廣播的方式通知重新整理

//註冊為廣播接收者
private LocalBroadcastManager lbm;
private BroadcastReceiver selectChangedReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//更新頁面(適配器)
/*----------------------------------------------------------------*/
if(vpSearch.getAdapter()!=null){
FragmentManager cfm = getChildFragmentManager();
FragmentTransaction ft = cfm.beginTransaction();
List<Fragment> fragments = cfm.getFragments();
if(fragments!=null && fragments.size()>0){
for(int i = 0; i < fragments.size(); i++) {
ft.remove(fragments.get(i));
}
}
ft.commit();
}

fenleiFragments.clear();
fenleiFragments.add(new CategoryFragment(Urls.getFenleiUrl(0)));
fenleiFragments.add(new BrandFragment(Urls.getFenleiUrl(1)));
fenleiFragments.add(new DongtaiFragment(Urls.getFenleiUrl(2)));

adapter.notifyDataSetChanged();
/*----------------------------------------------------------------*/
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//註冊廣播接收
lbm = LocalBroadcastManager.getInstance(getActivity());
lbm.registerReceiver(selectChangedReceiver,new IntentFilter(BroadcastVar.SELECT_CHANGED));
}
@Override
public void onDestroy() {
super.onDestroy();
if(lbm!=null){
lbm.unregisterReceiver(selectChangedReceiver);
selectChangedReceiver=null;
}
}

 【2】取消ViewPager預先載入

主要修改BaseFragment

屬性添加2個
private int isLoad=0;//是否已經載入過
private boolean isVisable;//是否可見

修改updateLoadingPage的getMyUrl()方法
public String getMyUrl() {
if(TextUtils.isEmpty(getUrl())){//本身就不需要連網
isLoad=1;
return getUrl();
}else{
if(isVisable){//需要連網,可見
isLoad=2;
return getUrl();
}else{//需要連網,不可見
isLoad=3;
return null;
}
}
}

重寫setUserVisibleHint方法
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisable=isVisibleToUser;

if(isVisibleToUser && isLoad==3){
//這時候loadingPage一定不為null,因為isLoad==3表示已經初始化過
loadingPage.show();
}
}

注意initData解析json的處理
JSONObject jsonObject = JSON.parseObject(content);
if(jsonObject==null){//因為為了防止ViewPager預先載入的時候手動將url置為了空,需要校正一下
return;
}

 【3】緩衝所有Fragment

vpSearch.setOffscreenPageLimit(fenleiFragments.size()-1);

另外FragmentPagerAdapter一定要按照上面的寫法。

 

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.