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

a_s*_*ber 4 android android-viewpager2

安卓工作室 3.6

我希望在我的活动中在 ViewPager2 中使用 2 个片段。

这是我的活动:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

这里 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到编译错误:

ViewPagerFragmentAdapter is not abstract and does not override abstract method createFragment(int) in FragmentStateAdapter
Run Code Online (Sandbox Code Playgroud)

我如何解决这个问题并在ViewPager2 中使用FRAGMENTS

谢谢

Zai*_*ain 9

FragmentStateAdapterinViewPager2与 in 略有不同ViewPager,如下所示:

  • 与其实施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);
    }

}
Run Code Online (Sandbox Code Playgroud)

还要确保导入/extebd ViewPager2 的正确适配器

import androidx.viewpager2.adapter.FragmentStateAdapter;
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,并且很高兴提供更多说明

  • 这是一个*非常*错误的实现。顾名思义,FragmentStateAdapter 的 createFragment 应该负责实例化 Fragment。片段的创建不应发生在“FragmentStateAdapter”之外。`FragmentStateAdapter` 将负责处理内存使用效率,即使你需要创建大量的 Fragment。如果在`FragmentStateAdapter`之外创建Fragment,则内存效率非常低。 (11认同)