【安卓筆記】ViewPager+Fragment佈局中的Fragment資料更新
阿新 • • 發佈:2019-02-08
這裡可能是GC回收掉了代表選項卡1的Fragment1物件,這時當我們滑會第一個介面時,重新建立了Fragment。這顯然不是我們期望的效果。
下面說下我的解決方案:
介面卡中應該提供一個設定介面卡資料的方法,這個方法可以向介面卡填充新的資料,並remove掉舊的資料。
按照這個思路,我們重構下MyPagerAdapter類:
首先加上這個成員:
/**
* 頁面內容集合
*/
private List<Fragment> fgs = null;
然後為其增加set方法:這樣當資料改變時,我們僅需呼叫setPagerItems方法即可重新設定資料。 但是考慮到剛才的需求是在一個Fragment中修改另一個Fragment佈局,在Fragment中呼叫setPagerItems似乎並不是很優雅,因為該Fragment並不應該知道父檢視中有哪些選項卡(Fragment),故而我們應該讓Activity呼叫setPagerItems方法。這時我們可以這樣做: 在介面卡中新增一個回撥介面:/** * 重新設定頁面內容 * @param items */ public void setPagerItems(List<Fragment> items) { if (items != null) { for (int i = 0; i < fgs.size(); i++) { mFragmentManager.beginTransaction().remove(fgs.get(i)).commit(); } fgs = items; } }
再新增一個設定回撥介面的方法:/** * @author Rowand jj *回撥介面 */ public interface OnReloadListener { public void onReload(); }
public void setOnReloadListener(OnReloadListener listener)
{
this.mListener = listener;
}
最後再提供一個reLoad方法:Activity在設定介面卡時,先為介面卡實現新增一個回撥函式,在回撥方法中呼叫setPagerItems方法重新設定資料。/** *當頁面資料發生改變時你可以呼叫此方法 * * 重新載入資料,具體載入資訊由回撥函式實現 */ public void reLoad() { if(mListener != null) { mListener.onReload(); } this.notifyDataSetChanged();//不可少,通知系統資料改變 }
adapter.setOnReloadListener(new OnReloadListener()
{
@Override
public void onReload()
{
fgs = null;
List<Fragment> list = new ArrayList<Fragment>();
list.add(new Tab1());
list.add(new Tab2());
list.add(new Tab3());
adapter.setPagerItems(list);
}
});
再剛才的介面2的Fragment的按鈕響應事件中呼叫: MainActivity a = (MainActivity) getActivity();
a.getAdapter().reLoad();
即可更新佈局,圖就不貼了。
最後貼出完整的MyPagerAdapter原始碼和MainActivity的原始碼:
MyPagerAdapter:
package com.example.viewpagerdemo2;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.util.Log;
/**
* @author Rowand jj
* 頁面介面卡
*/
public class MyPagerAdapter extends FragmentPagerAdapter
{
private static final String TAG = "YiPageAdapter";
/**
* 頁面內容集合
*/
private List<Fragment> fgs = null;
private FragmentManager mFragmentManager;
/**
* 當資料發生改變時的回撥介面
*/
private OnReloadListener mListener;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fgs)
{
super(fm);
this.fgs = fgs;
mFragmentManager = fm;
}
@Override
public Fragment getItem(int index)
{
Log.i(TAG,"ITEM CREATED...");
return fgs.get(index);
}
@Override
public int getCount()
{
return fgs.size();// 返回選項卡總數
}
@Override
public int getItemPosition(Object object)
{
return POSITION_NONE;
}
/**
* 重新設定頁面內容
* @param items
*/
public void setPagerItems(List<Fragment> items)
{
if (items != null)
{
for (int i = 0; i < fgs.size(); i++)
{
mFragmentManager.beginTransaction().remove(fgs.get(i)).commit();
}
fgs = items;
}
}
/**
*當頁面資料發生改變時你可以呼叫此方法
*
* 重新載入資料,具體載入資訊由回撥函式實現
*/
public void reLoad()
{
if(mListener != null)
{
mListener.onReload();
}
this.notifyDataSetChanged();
}
public void setOnReloadListener(OnReloadListener listener)
{
this.mListener = listener;
}
/**
* @author Rowand jj
*回撥介面
*/
public interface OnReloadListener
{
public void onReload();
}
}
MainActivity:package com.example.viewpagerdemo2;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import com.example.viewpagerdemo2.MyPagerAdapter.OnReloadListener;
public class MainActivity extends FragmentActivity
{
private ViewPager vPager = null;
private static final int TAB_COUNT = 3;
private MyPagerAdapter adapter = null;
private List<Fragment> fgs = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vPager = (ViewPager) findViewById(R.id.viewpager);
fgs = new ArrayList<Fragment>();
fgs.add(new Tab1());
fgs.add(new Tab2());
fgs.add(new Tab3());
adapter = new MyPagerAdapter(getSupportFragmentManager(), fgs);
adapter.setOnReloadListener(new OnReloadListener()
{
@Override
public void onReload()
{
fgs = null;
List<Fragment> list = new ArrayList<Fragment>();
list.add(new Tab1());
list.add(new Tab2());
list.add(new Tab3());
adapter.setPagerItems(list);
}
});
vPager.setAdapter(adapter);
}
/**
* 獲取介面卡
* @return
*/
public MyPagerAdapter getAdapter()
{
return adapter;
}
}
僅僅是提供一種思路,如果大家有好的思路請留言。