ViewPager2 не работает должным образом с фрагментами и событиями щелчка - PullRequest
0 голосов
/ 20 июня 2020

Я просто хочу знать, делаю ли я что-то не так, потому что я новичок во всем этом.
Если есть что-то еще, что вы хотите, чтобы я добавил, просто дайте мне знать.
Это - ветка репо, в которой я пытаюсь реализовать ViewPager, если вы хотите увидеть весь код.

Контекст

Итак, у меня есть 4 категории представленный Fragments, каждая из этих категорий содержит ArrayList элементов, каждый из которых имеет onItemClickListener, который должен воспроизводить некоторый звук.
Я пытаюсь отобразить Fragments с помощью ViewPager, но проблема в том, что когда я прокручиваю от Fragment к другому, а затем возвращаюсь к уже созданному Fragment, он не регистрирует событие касания , ничего не происходит, даже ошибка или исключение.
Если Я go на вновь созданный Fragment сенсорный экран работает нормально.
Кроме того, после переключения обратно на уже созданный Fragment , если я прокручиваю даже немного к другому Fragment и возвращаюсь или через ArrayList из этого Fragment по какой-то причине он снова начинает распознавать касание в элементах ArrayList.

Подобные вопросы, которые действительно не помогли

То, что я пробовал

  • Я пытался использовать coordinatorlayout, оборачивая ViewPager2, но разницы нет
  • Я читал некоторые официальные примеры viewPager2, написанные на Kotlin, но ни один из них, похоже, не имеет аналогичной ситуации (также мне трудно читать код Kotlin)

Фрагменты кода

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_main. 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>

Это один из фрагментов, остальные три в основном такие же, только элементы в arrayList изменяются и некоторые другие мелочи:

// ...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");
    }

}

Это адаптер категории, он управляет фрагментами:

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

1 Ответ

0 голосов
/ 21 июня 2020

добавьте это в вашу MainActivity viewPager.setOffscreenPageLimit(3); после создания viewpager

Это потому, что ViewPager имеет ограничение вне экрана по умолчанию, равное 1, а ViewPager2 имеет ограничение вне экрана по умолчанию, равное 0.

В ViewPager2 при переключении вкладок предыдущая вкладка будет автоматически обновлена.

в ViewPager, если у вас есть 3 или более вкладок, при переключении на 3-ю вкладку автоматически первая будет уничтожена, а когда вы перейдете на 1-ю вкладку, она будет воссоздана .

viewPager.setOffscreenPageLimit(3); из этой строки, когда вы переключаетесь на вкладку, предыдущие 3 вкладки будут предварительно загружены, а следующие 3 вкладки будут предварительно загружены, поэтому ничего не будет обновлено.

...