搜尋

首頁  >  問答  >  主體

android - ViewPager使用FragmentPagerAdapter和Fragment时如何刷新显示的数据

现在是这种情况,我的ViewPager使用FragmentPagerAdapter作为Adapter,在adapter中的getItem中返回一个新的Fragmentfragment显示的数据是从网上拿下来的,但是这个数据我需要刷新,刷新之后显示也要跟着刷新才对。现在问题就来了,这种模式下应该如何刷新fragment中的数据呢?
下面是我设置ViewPager的代码和FragmentPagerAdapter的代码,里面的数据仅仅是个模拟,但真实情况类似:

int[] arg1 = new int[]{1,2,3,4,5,6,7};
int[] arg2 = new int[]{11,22,33,44,55,66,77,88,99};

final FragmentPager adapter = new FragmentPager(getSupportFragmentManager());
adapter.setData(arg1);
viewPager.setAdapter(adapter);
viewPager.setPageTransformer(true, new Transformer());

private class FragmentPager extends FragmentPagerAdapter {

        private int[] data;

        public FragmentPager(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return BlankFragment.newInstance(data[position] +"");
        }

        @Override
        public int getCount() {
            return data.length;
        }

        public void setData(int[] arg) {
            data = arg;
        }
    }

下面是我的Fragment的代码(这个是根据Android Studio的模板生成的):

public class BlankFragment extends Fragment {
    private static final String ARG_PARAM1 = "param1";

    private String mParam1;

    public BlankFragment() {
    }

    public static BlankFragment newInstance(String param1 ) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank, container, false);
        ((TextView)view.findViewById(R.id.fragment_center_text)).setText(mParam1);
        return view;
    }
}

现在,假如说数据改变了,在这个例子中就是adaptersetData传入的数据改变了,我应该怎么属性Fragment的数据呢?
我查过很多解决方法,但是POSITION_NONEnotifyDataSetChanged()在这里并不能发挥作用,而且我也不希望这么做,原因在这个问题里:https://segmentfault.com/q/1010000004572993

PHPzPHPz2772 天前593

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 16:12:41

    覆寫getItemPosition使其返POSITION_NONE,以觸發Fragment的銷毀和重建。可是這將導致Fragment頻繁的銷毀和重建,並不是最佳的方法。
    getItemPosition(Object object) 入口參數object "representing an item", 實際上就是Fragment,只需要為Fragment提供一個更新view的public方法,然後把入口參數強制轉型成自定義的Fragment,調用該Fragment的update方法以完成更新。

    https://github.com/li2/Update_Replace_Fragment_In_ViewPager
    如何更新及替換ViewPager中 Fragment?

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:12:41

    如果Tab是有可能變化的 建議使用FragmentStatePagerAdapter,FragmentPagerAdapter被設計出來就是用於固定的Tab,當然也可以透過以下方案來支援刷新:

    private int mChildCount;
    
    @Override
    public void notifyDataSetChanged() {
        mChildCount = getCount();
        super.notifyDataSetChanged();
    }
    
    @Override
    public int getItemPosition(Object object) {
        if (mChildCount > 0) {
            mChildCount--;
            return POSITION_NONE;
        }
        return super.getItemPosition(object);
    }

    回覆
    0
  • 取消回覆