我有一个带有片段容器的Activity
布局。可以在其中显示3种不同的Fragment
。片段包含一个列表视图,该视图使用自定义适配器i显示数据。
因此,在查询数据库以获取数据之后,每个列表元素都在onCreateView
期间创建。
但有时我的数据库中的某些数据可能会发生变化,我想重新绘制/重新创建Listview。
拆卸并用它固定
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
方法,可用于刷新片段。
@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().
}
}
结合两个答案并删除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();
}
}
当片段中的数据发生变化时,将片段分离并重新连接到framelayout
总是一个好主意。在我的情况下,我有一个listview
,显示我的用户最喜欢的项目。一旦用户不同于产品,我必须将其从列表中删除并重新加载Favorites
片段。
所以我做了类似的事情将片段重新加载到帧布局中:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frm,new FavoritesFragment()).addToBackStack(null).commit();
在这里,frm
是MainActivity
中的框架布局,用于保存片段,而FavoritesFragment()
是需要重新加载的片段。
每次用户按unlike
按钮时,都应执行上述代码
根据FragmentTransaction#replace,它与调用remove然后添加相同。因此,当您启动片段或想要重新加载时,可以将.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();
}
这样,只有一个函数可以加载内容并传递数据。这假设您的布局中有一个ID为content_frag_container
的条目。我使用了FrameLayout。
这个方法适合我:
MyCameraFragment f2 = new MyCameraFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, f2);
transaction.addToBackStack(null);
transaction.commit();
以下代码刷新来自withIn的适配器片段
下载适配器代码:
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();
...
}