我有一个Activity
布局中有一个片段容器。
可以在其中显示3个不同的Fragment
。
片段包含一个列表视图,该视图使用我自定义的适配器显示数据。
因此,在我查询数据库以获取数据之后,每个列表元素都在onCreateView
期间创建。
但有时我的数据库中的某些数据可能会发生变化,我想重新绘制/重新创建Listview。
答案 0 :(得分:6)
使用
分离并附加它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);
答案 1 :(得分:4)
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().
}
}
答案 2 :(得分: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 :(得分:1)
如果您对上面列出的某些方法有疑问(如我在升级后遇到的那样),我建议在片段中创建某种公共刷新方法,然后简单地调用它,它的代码更少,更好更快,因为片段不需要重新初始化...
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();
}
答案 4 :(得分:0)
当片段中的数据更改时,将片段分离并重新附加到framelayout
总是一个好主意。就我而言,我有一个listview
,其中显示了我的用户喜欢的项目。一旦用户与某产品不同,我必须将其从列表中删除并重新加载Favorites
片段。
所以我做了这样的事情来将片段重新加载到框架布局中:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frm,new FavoritesFragment()).addToBackStack(null).commit();
在这里,frm
是MainActivity
中保存片段的帧布局,而FavoritesFragment()
是需要重新加载的片段。
以上代码应在用户每次按下unlike
按钮时执行
答案 5 :(得分:0)
根据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。
答案 6 :(得分:0)
此方法对我有用:
MyCameraFragment f2 = new MyCameraFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, f2);
transaction.addToBackStack(null);
transaction.commit();
答案 7 :(得分:0)
下面的代码从withIn适配器中刷新片段
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();
...
}
答案 8 :(得分:0)
在要刷新的片段中设置
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser){
if (getFragmentManager() != null) {
getFragmentManager()
?.beginTransaction()
?.detach(this)
?.attach(this)
?.commit();
}
}
}