gpt4 book ai didi

android - NotifyDataSetChanged 在带有 Viewpager2 的 FragmentStateAdapter 中不起作用

转载 作者:行者123 更新时间:2023-12-04 12:10:07 29 4
gpt4 key购买 nike

我正在使用带有 FragmentStateAdapter 的 viewpager2 创建一个文件选择页面。在其中一个页面中,我显示了所有已安装的存储设备,我想在这些设备上点击以查看内容,但我希望内容位于另一个 fragment 上。
我想在 viewpager 的最后一页中用另一个 fragment 替换 fragment 。但是使用下面的代码,页面只是刷新,新的 Fragment 没有被创建为 createFragment不会被调用。
我的寻呼机适配器

public static class PagerAdapter extends FragmentStateAdapter {


private Fragment mFragmentAtPos0;
private final FragmentManager mFragmentManager;
private final FirstPageListener listener = new FirstPageListener();
public final class FirstPageListener implements
FirstPageFragmentListener {
public void onSwitchToNextFragment() {
mFragmentManager.beginTransaction().remove(mFragmentAtPos0)
.commit();
if (mFragmentAtPos0 instanceof FilesandFolder_Others_MainPage){
mFragmentAtPos0 = new FileExplorer(listener);
}else{ // Instance of NextFragment
mFragmentAtPos0 = new FilesandFolder_Others_MainPage(listener);
}
notifyDataSetChanged();
}
public void onSwitchToNextFragment(Bundle bundle) {
// mFragmentManager.beginTransaction().remove(mFragmentAtPos0)
// .commit();
if (mFragmentAtPos0 instanceof FilesandFolder_Others_MainPage){
mFragmentAtPos0 = new FileExplorer(listener);
mFragmentAtPos0.setArguments(bundle);
}else{ // Instance of NextFragment
mFragmentAtPos0 = new FilesandFolder_Others_MainPage(listener);
mFragmentAtPos0.setArguments(bundle);
}
notifyDataSetChanged();
// notifyItemChanged(getItemPosition(mFragmentAtPos0));
}
}


// @Override
// public void onBindViewHolder(@NonNull FragmentViewHolder holder, int position, @NonNull List<Object> payloads) {
// super.onBindViewHolder(holder, position, payloads);
// if (position == getItemPosition(mFragmentAtPos0)) {
//
// Fragment f = mFragmentManager.findFragmentByTag("f" + holder.getItemId());
// if (f != null) {
// mFragmentManager.beginTransaction().replace(holder.getItemId(), )
// }
// }
// }

private int getItemPosition(Fragment mFragmentAtPos0) {
for (int i = 0; i < getItemCount(); i++){

if (createFragment(i).equals(mFragmentAtPos0)){
return i;
}
}
return -1;
}


public PagerAdapter(FragmentActivity fm) {
super(fm);
mFragmentManager = fm.getSupportFragmentManager();
mFragmentAtPos0 = new FilesandFolder_Others_MainPage(listener);
}

@NonNull
@Override
public Fragment createFragment(int position) {
switch (position){
case 0:
return new AppSelectionFragment();
case 1:
return new Photos();
case 2:
return new VideoGalleryFragment();
case 3:
return new Gallery();
default:
return mFragmentAtPos0;
}
}

@Override
public int getItemCount() {
return 5;
}
}

这是我想替换为另一个 Fragment 的 Fragment 的构造函数:
    private static FileSelection.PagerAdapter.FirstPageListener pageFragmentListener;

public FilesandFolder_Others_MainPage() {
}
public FilesandFolder_Others_MainPage(FileSelection.PagerAdapter.FirstPageListener firstPageFragmentListener) {
pageFragmentListener = firstPageFragmentListener;
}

在点击 View 时,
应该调用以下代码:-
Bundle bundle = new Bundle();
bundle.putString("PATH", volumes.get(position).path);
pageFragmentListener.onSwitchToNextFragment(bundle);
我已经搜索了整个 stackoverflow,但从来没有看到 viewpager 2 和 FragmentStateAdapter 的正确答案,因为每个人似乎都在使用 Viewpager
我试图实现这个:- FragmentStateAdapter for ViewPager2 notifyItemChanged not working as expected
但无法理解如何编辑我的代码。请帮忙
提前致谢

最佳答案

有同样的问题,这就是我发现的:FragmentStateAdapter有方法onBindViewHolder(holder, position, payloads) ,您可以覆盖它(不像 onBindViewHolder(holder, position) 是最终的)。当您调用 notify 时调用此方法方法,对于 notifyItemChanged() , notifyItemRangeChanged()您可以访问 fragment 并手动更新它的方法。
这是访问 fragment 的代码:

public void onBindViewHolder(@NonNull FragmentViewHolder holder, int position, @NonNull List<Object> payloads) {

String tag = "f" + holder.getItemId();

Fragment fragment = fragmentManager.findFragmentByTag(tag);

if (fragment != null) {
//manual update fragment
} else {
// fragment might be null, if it`s call of notifyDatasetChanged()
// which is updates whole list, not specific fragment
super.onBindViewHolder(holder, position, payloads);
}
}
FragmentStateAdapter"f" + holder.getItemId() 标记他的 fragment ,这就是它起作用的原因。
您也可以使用 DiffUtil ,这是更好的方法。 Here is good example解决这个问题,以及最后的一些链接,以便更好地理解 ViewPager2 .

关于android - NotifyDataSetChanged 在带有 Viewpager2 的 FragmentStateAdapter 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62880883/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com