数据更改时刷新片段内容的方法(如调用onCreateView)

问题描述 投票:6回答:7

我有一个带有片段容器的Activity布局。可以在其中显示3种不同的Fragment。片段包含一个列表视图,该视图使用自定义适配器i显示数据。

因此,在查询数据库以获取数据之后,每个列表元素都在onCreateView期间创建。

但有时我的数据库中的某些数据可能会发生变化,我想重新绘制/重新创建Listview。

  • 刷新片段视图的最佳方法是什么(我的意思是要求的资源越少)?
  • 有没有方法可以手动调用onCreateView?
android listview android-fragments fragment refresh
7个回答
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);

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
投票

结合两个答案并删除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();
  }
}

0
投票

当片段中的数据发生变化时,将片段分离并重新连接到framelayout总是一个好主意。在我的情况下,我有一个listview,显示我的用户最喜欢的项目。一旦用户不同于产品,我必须将其从列表中删除并重新加载Favorites片段。

所以我做了类似的事情将片段重新加载到帧布局中:

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

在这里,frmMainActivity中的框架布局,用于保存片段,而FavoritesFragment()是需要重新加载的片段。

每次用户按unlike按钮时,都应执行上述代码


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。


0
投票

这个方法适合我:

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

0
投票

以下代码刷新来自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();

...

}
© www.soinside.com 2019 - 2024. All rights reserved.