Я просто хочу знать, делаю ли я что-то не так, потому что я новичок во всем этом.
Если есть что-то еще, что вы хотите, чтобы я добавил, просто дайте мне знать.
Это - ветка репо, в которой я пытаюсь реализовать 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);
}
}