1. 程式人生 > >【安卓筆記】ViewPager+Fragment佈局中的Fragment資料更新

【安卓筆記】ViewPager+Fragment佈局中的Fragment資料更新

這裡可能是GC回收掉了代表選項卡1的Fragment1物件,這時當我們滑會第一個介面時,重新建立了Fragment。這顯然不是我們期望的效果。 下面說下我的解決方案: 介面卡中應該提供一個設定介面卡資料的方法,這個方法可以向介面卡填充新的資料,並remove掉舊的資料。 按照這個思路,我們重構下MyPagerAdapter類: 首先加上這個成員:
  /**
     * 頁面內容集合
     */
    private List<Fragment> fgs = null;
然後為其增加set方法:
 /**
     * 重新設定頁面內容
     * @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;
        }
    }
這樣當資料改變時,我們僅需呼叫setPagerItems方法即可重新設定資料。 但是考慮到剛才的需求是在一個Fragment中修改另一個Fragment佈局,在Fragment中呼叫setPagerItems似乎並不是很優雅,因為該Fragment並不應該知道父檢視中有哪些選項卡(Fragment),故而我們應該讓Activity呼叫setPagerItems方法。這時我們可以這樣做: 在介面卡中新增一個回撥介面:
/**
     * @author Rowand jj
     *回撥介面
     */
    public interface OnReloadListener
    {
        public void onReload();
    }
再新增一個設定回撥介面的方法:
public void setOnReloadListener(OnReloadListener listener)
    {
        this.mListener = listener;
    }
最後再提供一個reLoad方法:
/**
     *當頁面資料發生改變時你可以呼叫此方法
     * 
     * 重新載入資料,具體載入資訊由回撥函式實現
     */
    public void reLoad()
    {
        if(mListener != null)
        {
            mListener.onReload();
        }
         this.notifyDataSetChanged();//不可少,通知系統資料改變
    }
Activity在設定介面卡時,先為介面卡實現新增一個回撥函式,在回撥方法中呼叫setPagerItems方法重新設定資料。
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;
    }
}
僅僅是提供一種思路,如果大家有好的思路請留言。