gpt4 book ai didi

android - 为什么 FragmentStateAdapter 在 ViewPager2 中不起作用?

转载 作者:行者123 更新时间:2023-12-03 19:44:00 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Proper implementation of ViewPager2 in Android

(12 个回答)


2年前关闭。




安卓工作室 3.6

我想在我的 Activity 中使用 ViewPager2 中的 2 个 fragment 。

这是我的 Activity :

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
public class QRBluetoothSwipeActivity extends AppCompatActivity {
private ViewPager2 myViewPager2;
private ViewPagerFragmentAdapter myAdapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.AppTheme); // show splash screen
super.onCreate(savedInstanceState);
setContentView(R.layout.qr_bluetooth_swipe_activity);
init();
}

private void init() {
myAdapter = new ViewPagerFragmentAdapter(getSupportFragmentManager());
myAdapter.addFragment(new BluetoothPageFragment());
myAdapter.addFragment(new QrPageFragment());
myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
myViewPager2.setAdapter(myAdapter);
}

}

这里 ViewPagerFragmentAdapter
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.ArrayList;

public class ViewPagerFragmentAdapter extends FragmentStateAdapter {

private ArrayList<Fragment> arrayList = new ArrayList<>();

public ViewPagerFragmentAdapter(@NonNull FragmentManager fragmentManager) {
super(fragmentManager);
}

@NonNull
@Override
public Fragment getItem(int position) {
return arrayList.get(position);
}

public void addFragment(Fragment fragment) {
arrayList.add(fragment);
}

@Override
public int getItemCount() {
return arrayList.size();
}
}

但我得到编译错误:
ViewPagerFragmentAdapter is not abstract and does not override abstract method createFragment(int) in FragmentStateAdapter

我该如何解决这个问题并使用 fragment ViewPager2 ?

谢谢

最佳答案

FragmentStateAdapterViewPager2ViewPager 中的略有不同如下:

  • 而不是实现 getCount() , 实现 getItemCount()
  • 而不是实现 getItem(int position) , 实现 createFragment(int position)
  • 通过添加 Lifecycle 构造函数签名不同争论
    也应该包含在 super 中

  • 所以更换你的 ViewPagerFragmentAdapter与下面
    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentManager;
    import androidx.lifecycle.Lifecycle;
    import androidx.viewpager2.adapter.FragmentStateAdapter;

    import java.util.ArrayList;


    public class ViewPagerFragmentAdapter extends FragmentStateAdapter {

    private ArrayList<Fragment> arrayList = new ArrayList<>();

    public ViewPagerFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
    super(fragmentManager, lifecycle);
    }


    public void addFragment(Fragment fragment) {
    arrayList.add(fragment);
    }

    @Override
    public int getItemCount() {
    return arrayList.size();
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
    // return your fragment that corresponds to this 'position'
    return arrayList.get(position);
    }

    }
    还要确保导入/扩展 ViewPager2 的正确适配器
    import androidx.viewpager2.adapter.FragmentStateAdapter;
    2021 年更新
    这回答了问题的原始问题;但是创建 FragmentStateAdapter这种方式一般来说不太对;因为:
  • 拥有高性能ViewPager ,它应该只保留一些实例化的离屏页面 fragment 。
  • 将所有页面 fragment 保存在一个列表中,在浪费设备资源方面是不好的。
  • createFragment() ,顾名思义,旨在为特定页面创建一个新 fragment 并返回它;不要从已经实例化 fragment 的列表中返回 fragment 。
  • 最重要的是as per documentation createFragment(): :

  • Provide a new Fragment associated with the specified position.

    The adapter will be responsible for the Fragment lifecycle:

    • The Fragment will be used to display an item.
    • The Fragment will be destroyed when it gets too far from theviewport, and its state will be saved. When the item is close to theviewport again, a new Fragment will be requested, and a previouslysaved state will be used to initialize it.

    因此,我建议更改此设计以将其包括在内:
    假设您的页面 fragment 是 PageFragment ;那么你可以通过拥有 static PageFragment newInstance(int position) {} 来拥有单实例模式 PageFragment 中的方法,然后是 createFragment()那么应该是:
    @NonNull
    @Override
    public Fragment createFragment(int position) {
    // return a brand new fragment that corresponds to this 'position'
    return PageFragment.newInstance(position); // Create a new instance of the page fragment
    }

    关于android - 为什么 FragmentStateAdapter 在 ViewPager2 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58527131/

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