Google 前段时间出了新品 ViewPager2,据说意在替代旧版 ViewPager,功能更强大使用更方便;真的这么香么,小菜尝试学习一下!
优势
支持 RTL 布局,稍后介绍;
支持垂直方向切换;
支持 Fragment 集合刷新,即 notifyDataSetChanged;
版本
ViewPager2 目前处于预览版,还没有合并到主分支,可能还会有一些隐藏小问题,建议大家先尝试一下;
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'
问题
小菜尝试第一步要引入 ViewPager2,而此时就出现一个大问题,如下:
小菜当前 SDK 已是最新版本,首先按照提示在 AndroidManifest->application 添加错误中要求的,但是并不能解决问题,之后查阅了很多资料,发现 Androidx 与 Android support 库 不共存,这可真是麻烦了,如果在实际的项目中直接用可麻烦大了;
解决
既然不兼容,只好先转到 Androidx 库下,chenzhenlindx大神的博客很有帮助;
工程 -> Refactor -> Migrate to Androidx;
提示是否保存以前工程 zip 文件,看个人需求;
按提示 Do Refactor 重构即可;
尝试
小菜尝试绑定不同背景色和文字内容;与 ViewPager 不同的是,适配器需要使用 RecyclerView.Adapte,这也意味着绑定数据的方式更灵活,小菜为了测试 ViewPager2 新特性,设置了点击事件;
借助 setOrientation() 方法可以动态改变切换方向,水平或竖直;
借助 notifyDataSetChanged() 方法可以实时更新数据;
借助 setLayoutDirection() 方法可以动态调整内容展示方位,从左到右或从右到左;
此时感觉 ViewPager2 真的很方便,尤其是实时更新数据和动态调整切换方向,真香!
public class ViewPagerActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener { private ViewPager2 mVp; private List<Integer> list = new ArrayList<Integer>(); private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_pager); if (list != null) list.clear(); list.add(Color.RED); list.add(Color.GRAY); list.add(Color.BLUE); list.add(Color.YELLOW); mVp = (ViewPager2) findViewById(R.id.view_pager); adapter = new MyAdapter(this, list); mVp.setAdapter(adapter); adapter.setOnItemClickListener(this); } @Override public void onItemClick(int position) { Toast.makeText(getApplication(), "当前position=" + (position + 1), Toast.LENGTH_SHORT).show(); switch (position){ case 0: //mVp.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); break; case 1: list.set(position, Color.GREEN); adapter.notifyDataSetChanged(); break; case 2: mVp.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL); break; case 3: mVp.setOrientation(ViewPager2.ORIENTATION_VERTICAL); break; } } }class MyAdapter extends RecyclerView.Adapter { Context context; List<Integer> list; MyAdapter(Context context, List<Integer> list) { this.context = context; this.list = list; } private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } public interface OnItemClickListener { void onItemClick(int position); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view_pager, parent, false); final MyViewHolder mViewHolder = new MyViewHolder(v); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick((Integer) v.getTag()); if((Integer) v.getTag()==0){ mViewHolder.mTv.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); } } } }); return mViewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { ((MyViewHolder) holder).mLay.setBackgroundColor(list.get(position)); ((MyViewHolder) holder).mTv.setText("当前 position = "+(position+1)); ((MyViewHolder) holder).itemView.setTag(position); } @Override public int getItemCount() { return list != null ? list.size() : 0; } class MyViewHolder extends RecyclerView.ViewHolder { LinearLayout mLay; TextView mTv; public MyViewHolder(View itemView) { super(itemView); mLay = (LinearLayout) itemView.findViewById(R.id.item_view_pager_lay); mTv = (TextView) itemView.findViewById(R.id.item_view_pager_tv); } } }
扩展
小菜以前没有注意过 supportsRtl 属性,实际很久以前就有了,根据设置内容居左或居右;
需要 AndroidManifest->application 中添加 android:supportsRtl="true" 属性;
内边距和外边距建议设置 start/end 方式;
ViewPager2 中设置 setLayoutDirection 时,整个 ViewPager2 不仅子 item 内容反向,整体也反向;只有子 item 设置 setLayoutDirection 时会反向。
小结
小菜在学习过程中发现 ViewPager2 确实有很大优势,只是目前还没有发布到正式版,而且对于版本适配也会有一定难度,对于 Fragment 的懒加载与预加载还有待研究;但是学习体验一下还是很有帮助的!
作者:阿策神奇
共同学习,写下你的评论
评论加载中...
作者其他优质文章