我只是想知道是否做错了什么,因为我对这一切都很新。
如果还有其他你想让我添加的内容,请告诉我。
这里是我正在尝试实现ViewPager的repo分支,如果你想查看所有代码。
上下文
所以我有4个类别用Fragments
表示,每个类别都拥有一个ArrayList
的项目,每个项目都有一个onItemClickListener
,应该播放一些音频。我正在尝试使用ViewPager显示
Fragments
,但问题在于当我从一个Fragment
滚动到另一个Fragment
,然后回到已创建的Fragment
时,它不会注册触摸事件,什么也不会发生,甚至没有错误或异常。如果我去一个新创建的
Fragment
,触摸就可以正常工作。此外,在切换回已创建的
Fragment
后,如果我滚动即使只是很少一点到另一个Fragment
,然后回来或通过那个Fragment
的ArrayList
,由于某种原因,它开始再次识别ArrayList
项中的触摸。
类似的问题并没有真正帮助
- 如果滚动位置为0,则ViewPager2中的片段不响应点击
- ViewPager2与SwipeRefreshLayout冲突
- 包含recyclerview的片段的Android ViewPager2不滚动
我尝试过的方法
- 我尝试使用
coordinatorlayout
包装ViewPager2
,但没有任何区别 - 我已经阅读了一些用Kotlin编写的官方viewPager2示例,但它们似乎没有类似的情况(而且很难阅读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);
}
}
viewPager.setOffscreenPageLimit(3);
- sai Pavan Kumar