- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有 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
有方法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/
ViewPager2 正在删除最后一个选项卡而不是当前选项卡,当我使用 viewpager 时发生了同样的问题。 此选中选项卡在最后一个选项卡时,它会正确删除最后一个选项卡 依赖 implementa
我正在使用 ViewPager2 和 FragmentStateAdapter。 public class MyAdapter extends FragmentStateAdapter { p
这个问题在这里已经有了答案: Proper implementation of ViewPager2 in Android (12 个回答) 2年前关闭。 安卓工作室 3.6 我想在我的 Activi
我正在将 ViewPager2 与 FragmentStateAdapter 一起使用,并且我正在调用 notifyItemChanged(position)。但正如预期的那样,createFragm
在 ViewPager2 位于片段中的静态(3 页)ViewPager2 设置中,我在 FragmentStateAdapter 后代中创建了 3 个片段。我什至在该后代的表( MutableList
我使用数组列表中的数据创建初始内容(我从 firebase 获取)数据每 15 分钟更改一次,我如何调用娱乐或如何将文本从主要 Activity 设置为 fragment/我如何更新 fragment
所以几个月来我一直在尝试从我的应用程序中动态添加和删除 fragment 。我最近迁移到 viewpager2 和 fragmentstateadapter 但无济于事。我的目标是完全删除特定位置的
我正在使用带有 FragmentStateAdapter 的 viewpager2 创建一个文件选择页面。在其中一个页面中,我显示了所有已安装的存储设备,我想在这些设备上点击以查看内容,但我希望内容位
我有一个 FragmentStateAdapter 作为 ViewPager2 的适配器。 class DefaultFragmentStateAdapter(fragment: Fragment)
我正在使用 ViewPager2 构建应用程序滑动时显示不同的 fragment 。我的适配器扩展 FragmentStateAdapter如所述here . 当我将我的应用程序放入后台然后再次恢复时
当我切换到 viewPager2 时,我必须实现另一种类型的适配器(我使用 FragmentPagerAdapter,现在我使用 FragmentStateAdapter),现在我想调用具有旧适配器但
我有viewPager2和FragmentStateAdapter,还有Fragement1、2,3 4,我在fragment2,想去掉fragment3,在fragment2之后显示fragment
我正在为我的项目使用 ViewPager2。我需要在带有 viewpager2 的 fragment 中使用嵌套 fragment 。在我尝试在 fragment (不是嵌套的 fragment )之
我使用 ViewPager2 和 FragmentStateAdapter 显示 5 个 fragments。每个 fragment 都有 ExoPlayer 实例。我正在维护ViewPager2.s
FragmentStateAdapter 抛出 java.lang.IllegalStateException: Design assumption violated, 当设备旋转时。我该如何解决这个
我是一名优秀的程序员,十分优秀!