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

时间:2015-09-02 17:38:10

标签: android listview android-fragments fragment refresh

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

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

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

  • 刷新片段视图的最佳方法是什么(我的意思是要求的资源越少)?
  • 是否有方法手动调用onCreateView?

9 个答案:

答案 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();

在这里,frmMainActivity中保存片段的帧布局,而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();
        }
    }
}