レイアウトにフラグメントコンテナーを含むActivity
があります。 3つの異なるFragment
を表示できます。フラグメントには、作成したカスタムアダプターでデータを表示するリストビューが含まれています。
したがって、各リスト要素は、データベースにデータを照会してデータを取得した後、onCreateView
の間に作成されます。
しかし、データベースの一部のデータが変更される場合があります。リストビューで再描画/再作成したいと思います。
取り外して取り付けます
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);
フラグメントをリフレッシュするために使用できる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().
}
}
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();
}
}
上記のいくつかのメソッドで問題が発生した場合(アップグレードした後のように...)、ある種のパブリックリフレッシュメソッドをフラグメントで作成し、それを単に呼び出すことをお勧めします。フラグメントを再初期化する必要はありません...
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();
}
次のコードは、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();
...
}
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を使用しました。
フラグメント内のデータが変更された場合、フラグメントをデタッチしてframelayout
に再アタッチすることを常にお勧めします。私の場合、ユーザーのお気に入りのアイテムを表示するlistview
があります。ユーザーが製品とは異なる場合は、リストから削除してFavorites
フラグメントを再ロードする必要があります。
だから私はフラグメントをフレームレイアウトに再ロードするためにこのようなことをしました:
_FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frm,new FavoritesFragment()).addToBackStack(null).commit();
_
ここで、frm
は、フラグメントを保持するMainActivity
のフレームレイアウトであり、FavoritesFragment()
は、再ロードする必要のあるフラグメントです。
上記のコードは、ユーザーがunlike
ボタンを押すたびに実行する必要があります
この方法は私にとってはうまくいきます:
MyCameraFragment f2 = new MyCameraFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, f2);
transaction.addToBackStack(null);
transaction.commit();