6

AndroidでViewPagerのコンテンツをリセットする方法を教えてください。adapter.notifyDataSetChanged()を呼び出そうとしましたが、ビューをスクロールしたときにアダプターがgetItem(position)を呼び出さない。常に古い子ビューを返します。

更新:これは私のフラグメントビューです。viewPagerデータをリセットすると、ロードされたフラグメントビューが使用されました。コンストラクターではなく、onCreateViewから開始します。

public class ResultView extends Fragment {
//Declare properties

     //Constructor 
public ResultView(Province province, Calendar calendar) {
    Log.d("xskt", "ResultView constructor");
    this.province = province;
    this.calendar = (Calendar) calendar.clone();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("xskt", "ResultView onCreateView");
    View view = inflater.inflate(R.layout.resultview, null);

    //do some thing

    return view;
}

ありがとう。

4

4 に答える 4

38

FragmentStatePagerAdapterの代わりに使用するように変更しましFragmentPagerAdapterた。問題は解決しました。お役に立てれば。

于 2012-12-05T02:21:37.260 に答える
2

フラグメントを別のフラグメントにリロードするための最良の解決策は次のとおりだと思います。

@Override
public void onPause() {
    super.onResume();
    List<Fragment> fragments = getFragmentManager().getFragments();
    if (fragments != null) {
        FragmentTransaction fragmentTransaction  = getFragmentManager().beginTransaction();
        for (Fragment fragment : fragments) {
            if (fragment instanceof Fragment) {
                fragmentTransaction.remove(fragment);
            }
        }
        fragmentTransaction.commitNowAllowingStateLoss();
    }
}

ユースケースが必要かどうかを確認してcommitNowAllowingStateLossくださいcommitAllowingStateLoss

于 2017-05-21T19:17:59.170 に答える
0

1 つの方法は、オブザーバー パターンを使用することです。提示しているデータは、sqlite DB (またはメモリに格納されている) にある可能性があります。データが変更されたときにフラグメントに必要な更新を行うリスナーをフラグメントに設定できます。

于 2012-12-04T16:11:48.907 に答える
0

次のようにすると機能します。

  • viewPager を無効にしてキャッシュを無効にする
  • notifyDataSetChanged() を呼び出して、アダプターに変更があり、フラグメントを更新する必要があることを伝えます。
  • FragmentStatePagerAdapter で getItemPosition をオーバーライドして、すべてのフラグメントを更新します

アクティビティ内またはデータを更新する場所:

viewPager.invalidate();
fragmentStatePageAdapter.notifyDataSetChanged();

FragmentStatePageAdapter で:

@Override
public int getItemPosition(@NotNull Object object) {
    return POSITION_NONE;
}
于 2021-02-10T15:45:45.650 に答える