web-dev-qa-db-ja.com

データが変更されたときにフラグメントコンテンツを更新するメソッド(onCreateViewの呼び出しなど)

レイアウトにフラグメントコンテナーを含むActivityがあります。 3つの異なるFragmentを表示できます。フラグメントには、作成したカスタムアダプターでデータを表示するリストビューが含まれています。

したがって、各リスト要素は、データベースにデータを照会してデータを取得した後、onCreateViewの間に作成されます。

しかし、データベースの一部のデータが変更される場合があります。リストビューで再描画/再作成したいと思います。

  • フラグメントビューを更新するための最良の方法(つまり、要求するリソースが少ないこと)は何ですか?
  • OnCreateViewを手動で呼び出す方法はありますか?
7
Heretyk

取り外して取り付けます

Fragment currentFragment = getFragmentManager().findFragmentByTag("YourFragmentTag");
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.detach(currentFragment);
fragmentTransaction.attach(currentFragment);
fragmentTransaction.commit();

またはでフラグメントを検索

Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);
7
Michele Lacorte

フラグメントをリフレッシュするために使用できるFragmentの非常に便利なメソッドが1つあります。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        //Write down your refresh code here, it will call every time user come to this fragment. 
       //If you are using listview with custom adapter, just call notifyDataSetChanged(). 
    }
}
4
M.Usman

2つの回答を組み合わせてif (isVisibleToUser)を削除しました。これにより、setUserVisibleHintが予期しない非同期の順序で呼び出され、フラグメントを更新できるかどうかが決まります。私はこのコードの一部が安定していることを(フラグメントで)見つけました:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

  // Refresh tab data:

  if (getFragmentManager() != null) {

    getFragmentManager()
      .beginTransaction()
      .detach(this)
      .attach(this)
      .commit();
  }
}
3
Zon

上記のいくつかのメソッドで問題が発生した場合(アップグレードした後のように...)、ある種のパブリックリフレッシュメソッドをフラグメントで作成し、それを単に呼び出すことをお勧めします。フラグメントを再初期化する必要はありません...

FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
Fragment fragment = fm.findFragmentById(R.id.your_fragment_id);
if(fragment instanceof YourFragmentClass) // avoid crash if cast fail
{
    ((YourFragmentClass)fragment).showPrayer();
}

コードを介してフラグメントを追加し、フラグメントを追加するときにタグ文字列を使用した場合は、代わりにfindFragmentByTagを使用します。

Fragment fragment = fm.findFragmentByTag("yourTag");
if(fragment instanceof YourFragmentClass)
{
    ((YourFragmentClass)fragment).showPrayer();
}
1
omanosoft

次のコードは、withIn a Adapterからのフラグメントを更新します

DownloadsAdapterコード:

public class DownloadsAdapter extends RecyclerView.Adapter<DownloadsAdapter.ViewHolder> {

private Context mCtx;

//getting the context and product list with constructor
public DownloadsAdapter(Context mCtx, List<DataModel> fileUrlLinkList) {
    this.mCtx = mCtx;
    this.fileUrlList = fileUrlLinkList;

}

**... and in onBindViewHolder**

 FragmentManager manager = ((AppCompatActivity) mCtx).getSupportFragmentManager();
 Fragment currentFragment = manager.findFragmentByTag("DOWNLOADS");
 FragmentTransaction fragmentTransaction = manager.beginTransaction();
 fragmentTransaction.detach(currentFragment);
 fragmentTransaction.attach(currentFragment);
 fragmentTransaction.commit();

...

}
0
kushal.8

FragmentTransaction#replace によると、removeを呼び出してからaddを呼び出すのと同じです。したがって、フラグメントを開始するとき、またはフラグメントを再ロードするときに、フラグメントマネージャで.replaceを使用できます。したがって、onCreateから同じ関数を使用し、リロードする場所も使用します...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        loadContentFragment();
    }
}

private void someFunctionThatChangesValue(String value) {
    mValue = value;
    loadContentFragment();
}

private void loadContentFragment() {
    ContentListFragment newFrag = ContentListFragment.newInstance();
    // passing value from activity
    Bundle args = new Bundle();
    args.putString(Constants.ARG_ACCOUNT_NAME, mValue);
    newFrag.setArguments(args);
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frag_container,
                    newFrag,
                    Constants.CONTENT_FRAGMENT)
            .commitNow();
}

このように、コンテンツをロードしてデータを渡す関数は1つだけです。これは、レイアウトにID content_frag_containerのエントリがあることを前提としています。 FrameLayoutを使用しました。

0
Mike

フラグメント内のデータが変更された場合、フラグメントをデタッチしてframelayoutに再アタッチすることを常にお勧めします。私の場合、ユーザーのお気に入りのアイテムを表示するlistviewがあります。ユーザーが製品とは異なる場合は、リストから削除してFavoritesフラグメントを再ロードする必要があります。

だから私はフラグメントをフレームレイアウトに再ロードするためにこのようなことをしました:

_FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frm,new FavoritesFragment()).addToBackStack(null).commit();
_

ここで、frmは、フラグメントを保持するMainActivityのフレームレイアウトであり、FavoritesFragment()は、再ロードする必要のあるフラグメントです。

上記のコードは、ユーザーがunlikeボタンを押すたびに実行する必要があります

0

この方法は私にとってはうまくいきます:

MyCameraFragment f2 = new MyCameraFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, f2);
transaction.addToBackStack(null);
transaction.commit();
0
Akshay Shah