gpt4 book ai didi

java - ViewPager2 无法与 fragment 和点击事件一起正常工作

转载 作者:行者123 更新时间:2023-12-04 11:47:20 25 4
gpt4 key购买 nike

我只是想知道我是否做错了什么,因为我对这一切有点陌生。
如果您还希望我添加任何其他内容,请告诉我。
This如果您想查看所有代码,我正在尝试实现 ViewPager 的 repo 分支。

语境

所以我有 4 个类别,用 Fragments 表示,每个类别都有一个 ArrayList每个项目都有 onItemClickListener那应该重现一些音频。
我正在尝试显示 Fragments使用 ViewPager 但 问题是当我从 Fragment 滚动时到另一个,然后回到已经创建的Fragment ,它不注册触摸事件 ,什么都没有发生,甚至没有错误或异常。
如果我去一个新创建的Fragment触摸效果很好。
此外,在切换回已创建的 Fragment如果我滚动一点点到另一个 Fragment并卷土重来或通过ArrayList其中Fragment由于某种原因,它开始识别 ArrayList 中的触摸。再次项目。

没有真正帮助的类似问题

  • Fragments in ViewPager2 does not respond to clicks if scroll position is 0
  • ViewPager2 conflicting with SwipeRefreshLayout
  • Android ViewPager2 with fragment containing a recyclerview not scrolling

  • 我试过的
  • 我尝试使用 coordinatorlayout包装 ViewPager2但是没有区别
  • 我一直在阅读一些用 Kotlin 编写的官方 viewPager2 示例,但似乎都没有类似的情况(我也很难阅读 Kotlin 代码)

  • 代码 fragment

    word_list.xml:

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/tan_background" />

    Activity 主.xml:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="MainActivity">

    <androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"/>

    </FrameLayout>

    这是Fragments之一,其他三个基本一样,只是arrayList中的item发生了变化以及其他一些小事情:

    // ...Skipped some irrelevant code...

    public class NumbersFragment extends Fragment {
    private ArrayList<Word> mWords;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.word_list, container, false);

    mWords = new ArrayList<>();
    // ...Add all the items to the list...

    // Make the adapter for the word items
    WordAdapter adapter = new WordAdapter(getActivity(), mWords, R.color.category_numbers);
    // Find the root view of the list
    ListView listView = rootView.findViewById(R.id.root_list_view);
    // Add adapter to the root list view
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Log.d("NumbersFragment", "CLICKED");
    }
    }

    });

    return rootView;
    }

    @Override
    public void onPause() {
    super.onPause();

    Log.d("NumbersFragment", "Fragment paused");
    }

    }

    这是 Category 适配器,它管理 fragment :

    public class CategoryAdapter extends FragmentStateAdapter {
    private static final int NUM_CATEGORIES = 4;

    // Required public constructor
    public CategoryAdapter(@NonNull FragmentActivity fragmentActivity) {
    super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
    // Depending on which page the user is in,
    // create a fragment of the corresponding category
    switch (position) {
    case 0:
    return new NumbersFragment();
    case 1:
    return new FamilyFragment();
    case 2:
    return new ColorsFragment();
    default:
    return new PhrasesFragment();
    }
    }

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

    这是我的 MainActivity:

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the content of the activity to use the activity_main.xml layout file
    setContentView(R.layout.activity_main);

    // Find the view pager that will allow the user to swipe between fragments
    ViewPager2 viewPager = findViewById(R.id.viewpager);

    // Create an adapter that knows which fragment should be shown on each page
    CategoryAdapter adapter = new CategoryAdapter(this);
    //or CategoryAdapter adapter = new CategoryAdapter(getSupportFragmentManager(), getLifecycle());

    // Set the adapter into the view pager
    viewPager.setAdapter(adapter);
    }
    }

    最佳答案

    将此添加到您的 MainActivity viewPager.setOffscreenPageLimit(3);创建 viewpager 后
    这是因为 ViewPager 的默认离屏限制为 1,而 ViewPager2 的默认离屏限制为 0。
    在 ViewPager2 中,当您切换选项卡时,前一个选项卡将自动刷新。
    在 ViewPager 中,如果您有 3 个或更多选项卡,当您自动切换到第三个选项卡时,第一个选项卡将被销毁,当您转到第一个选项卡时,它将被重新创建。viewPager.setOffscreenPageLimit(3);当您切换到一个选项卡时,从这一行开始,前 3 个选项卡将被预加载,接下来的 3 个选项卡将被预加载,因此不会刷新任何内容。

    关于java - ViewPager2 无法与 fragment 和点击事件一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62482300/

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