jsp和php哪个做网站快,织梦做的相亲网站,网站做政务,阿里云云虚拟主机在新闻资讯 APP 中添加不同新闻分类页面#xff0c;通过 ViewPager2 实现滑动切换
核心组件的作用
ViewPager2#xff1a;是 ViewPager 的升级版#xff0c;基于RecyclerView实现#xff0c;支持水平 / 垂直滑动、RTL#xff08;从右到左#xff09;布局#xff0c;且修…在新闻资讯 APP 中添加不同新闻分类页面通过 ViewPager2 实现滑动切换
核心组件的作用
ViewPager2是 ViewPager 的升级版基于RecyclerView实现支持水平 / 垂直滑动、RTL从右到左布局且修复了 ViewPager 的诸多缺陷如 notifyDataSetChanged 不生效、滑动冲突等。Fragment可复用的 UI 组件作为 ViewPager2 的 “页面” 内容每个滑动页面对应一个 Fragment 实例。FragmentStateAdapterViewPager2 的适配器专门用于管理 Fragment 与 ViewPager2 的绑定负责创建、销毁 Fragment类似 RecyclerView 的 Adapter。TabLayout可选通常与 ViewPager2 配合使用显示标签标题实现 “标签点击切换 滑动切换” 的联动效果。
开发步骤
1.引入依赖
ViewPager2 属于 AndroidX 库需在build.gradleModule 级别中添加依赖确保版本兼容
dependencies {// ViewPager2核心依赖implementation androidx.viewpager2:viewpager2:1.0.0// Fragment依赖若已引入AndroidX Fragment可忽略implementation androidx.fragment:fragment-ktx:1.5.6// 可选TabLayout联动依赖与ViewPager2配合implementation com.google.android.material:material:1.9.0
}2.创建Fragment页面
每个滑动页面对应一个 Fragment需创建多个 Fragment如首页、推荐、我的等。
以 首页页面为例NonNullOverridepublic ViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {View view LayoutInflater.from(context).inflate(R.layout.item_recommend_user, parent, false);return new ViewHolder(view);}每个 Fragment 对应一个布局文件如fragment_home.xml仅需简单的 UI 内容即可。
3.自定义一个ViewPage2布局
在 Activity 的布局文件中添加 ViewPager2若需要标签页可搭配 TabLayout
我这里把之前写的recyclerView给改成了ViewPage2用来实现页面的切换
?xml version1.0 encodingutf-8?
androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent!-- 顶部区域搜索框 分类栏 --LinearLayoutandroid:idid/top_containerandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalandroid:elevation4dpapp:layout_behavior.util.ScrollAwareFABBehavior!-- 搜索栏 --LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalandroid:background#D3D3D3android:padding8dpandroid:elevation2dpEditTextandroid:idid/search_edit_frameandroid:layout_width0dpandroid:layout_height40dpandroid:layout_weight3android:backgrounddrawable/search_bgandroid:paddingHorizontal12dpandroid:singleLinetrue /Buttonandroid:idid/buttonandroid:layout_width0dpandroid:layout_height40dpandroid:layout_weight1android:text搜索android:backgroundTint#4CAF50android:textColorandroid:color/white //LinearLayout!-- 分类栏 --LinearLayoutandroid:idid/category_barandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:orientationhorizontalandroid:backgroundandroid:color/whiteandroid:elevation1dpTextViewandroid:idid/tab_hotandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:text热榜android:textSize16spandroid:textColor#333333android:gravitycenterandroid:clickabletrueandroid:background?attr/selectableItemBackground /TextViewandroid:idid/tab_followandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:text关注android:textSize16spandroid:textColor#333333android:gravitycenterandroid:clickabletrueandroid:background?attr/selectableItemBackground /TextViewandroid:idid/tab_recommendandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:text推荐android:textSize16spandroid:textColor#333333android:gravitycenterandroid:clickabletrueandroid:background?attr/selectableItemBackground /TextViewandroid:idid/tab_cityandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:text同城android:textSize16spandroid:textColor#333333android:gravitycenterandroid:clickabletrueandroid:background?attr/selectableItemBackground //LinearLayout/LinearLayout!-- ViewPager2容器 --androidx.viewpager2.widget.ViewPager2android:idid/view_pagerandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:layout_marginTop?attr/actionBarSize /!-- 底部导航栏保持原设计 --LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalandroid:padding8dpandroid:background#FFFFFFandroid:layout_gravitybottom !-- 首页 --LinearLayoutandroid:idid/home_tabandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:orientationverticalandroid:gravitycenterImageViewandroid:layout_width25dpandroid:layout_height25dpandroid:layout_gravitycenter_horizontalandroid:srcdrawable/mainandroid:contentDescription首页图标/TextViewandroid:idid/home_textandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textSize16dpandroid:text首页android:gravitycenter_horizontal//LinearLayout!-- 菜单 --LinearLayoutandroid:idid/menu_tabandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:orientationverticalandroid:gravitycenterImageViewandroid:layout_width25dpandroid:layout_height25dpandroid:layout_gravitycenter_horizontalandroid:srcdrawable/menuandroid:contentDescription菜单图标/TextViewandroid:idid/menu_textandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textSize16dpandroid:text菜单android:gravitycenter_horizontal//LinearLayout!-- 我的 --LinearLayoutandroid:idid/mine_tabandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:layout_weight1android:orientationverticalandroid:gravitycenterImageViewandroid:layout_width25dpandroid:layout_height25dpandroid:layout_gravitycenter_horizontalandroid:srcdrawable/mineandroid:contentDescription我的图标/TextViewandroid:idid/mine_textandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textSize16dpandroid:text我的android:gravitycenter_horizontal//LinearLayout/LinearLayout
/androidx.coordinatorlayout.widget.CoordinatorLayout4.实现FragmentStateAdapter
ViewPager2 需要实现FragmentStateAdapter管理 Fragment类似 RecyclerView 的 Adapter。FragmentStateAdapter会根据页面切换动态创建 / 销毁 Fragment优化内存占用。
package com.example.news.adapter;import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.example.news.fragment.*;public class CategoryPagerAdapter extends FragmentStateAdapter {public CategoryPagerAdapter(NonNull FragmentActivity fragmentActivity) {super(fragmentActivity);}NonNullOverridepublic Fragment createFragment(int position) {switch (position) {case 0:return new HotFragment();case 1:return new FollowFragment();case 2:return new RecommendFragment();case 3:return new CityFragment();default:throw new IllegalArgumentException(Invalid position: position);}}Overridepublic int getItemCount() {return 4; // 四个分类页面}
}5.初始化 ViewPager2 并绑定适配器
public class MainActivity extends AppCompatActivity {private ViewPager2 viewPager2;private TabLayout tabLayout;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager2 findViewById(R.id.view_pager2);tabLayout findViewById(R.id.tab_layout);// 1. 创建Fragment集合ListFragment fragments new ArrayList();fragments.add(new HomeFragment());fragments.add(new RecommendFragment());fragments.add(new MineFragment());// 2. 创建适配器并绑定ViewPager2MyViewPager2Adapter adapter new MyViewPager2Adapter(this, fragments);viewPager2.setAdapter(adapter);// 3. 可选关联TabLayout与ViewPager2实现标签与页面同步new TabLayoutMediator(tabLayout, viewPager2, (tab, position) - {// 设置标签文本根据position动态设置switch (position) {case 0:tab.setText(首页);break;case 1:tab.setText(推荐);break;case 2:tab.setText(我的);break;}}).attach(); // 必须调用attach()才会生效}
}可选配置 ViewPager2 高级属性
根据需求设置 ViewPager2 的滑动方向、预加载、滑动禁用等属性
// 1. 设置滑动方向默认水平可改为垂直
viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);// 2. 设置预加载页面数量默认预加载相邻1页不能设置为0
viewPager2.setOffscreenPageLimit(1); // 预加载1页左右各1页// 3. 禁用滑动保留编程式切换如仅通过Tab点击切换
viewPager2.setUserInputEnabled(false);// 4. 页面切换监听监听滑动状态、位置变化
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {// 页面滚动时回调}Overridepublic void onPageSelected(int position) {// 页面选中时回调常用更新标题栏、加载数据等Log.d(ViewPager2, 选中第 position 页);}Overridepublic void onPageScrollStateChanged(int state) {// 滑动状态变化SCROLL_STATE_IDLE静止、SCROLL_STATE_DRAGGING拖动、SCROLL_STATE_SETTLING惯性滑动}
});FragmentStateAdapter 的工作原理
FragmentStateAdapter通过createFragment(int position)为每个位置创建 Fragment且会缓存当前页及相邻页的 Fragment数量由offscreenPageLimit控制。当 Fragment 不可见且超出缓存范围时会被销毁调用onDestroy()但状态会被保存通过onSaveInstanceState()下次显示时重建并恢复状态。构造方法必须传入FragmentActivity或Fragment因为适配器需要通过它们的getSupportFragmentManager()和Lifecycle管理 Fragment 生命周期。