前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android ViewPager2 真的香么?

Android ViewPager2 真的香么?

作者头像
阿策小和尚
发布2019-08-12 16:27:49
2.1K0
发布2019-08-12 16:27:49
举报
文章被收录于专栏:阿策小和尚阿策小和尚

Google 前段时间出了新品 ViewPager2,据说意在替代旧版 ViewPager,功能更强大使用更方便;真的这么香么,和尚尝试学习一下!

优势

  1. 支持 RTL 布局,稍后介绍;
  2. 支持垂直方向切换;
  3. 支持 Fragment 集合刷新,即 notifyDataSetChanged

版本

ViewPager2 目前处于预览版,还没有合并到主分支,可能还会有一些隐藏小问题,建议大家先尝试一下;

代码语言:javascript
复制
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'

问题

和尚尝试第一步要引入 ViewPager2,而此时就出现一个大问题,如下:

和尚当前 SDK 已是最新版本,首先按照提示在 AndroidManifest->application 添加错误中要求的,但是并不能解决问题,之后查阅了很多资料,发现 AndroidxAndroid support不共存,这可真是麻烦了,如果在实际的项目中直接用可麻烦大了;

解决

既然不兼容,只好先转到 Androidx 库下,chenzhenlindx大神的博客很有帮助;

  1. 工程 -> Refactor -> Migrate to Androidx
  2. 提示是否保存以前工程 zip 文件,看个人需求;
  1. 按提示 Do Refactor 重构即可;

尝试

和尚尝试绑定不同背景色和文字内容;与 ViewPager 不同的是,适配器需要使用 RecyclerView.Adapte,这也意味着绑定数据的方式更灵活,和尚为了测试 ViewPager2 新特性,设置了点击事件;

  1. 借助 setOrientation() 方法可以动态改变切换方向,水平或竖直;
  2. 借助 notifyDataSetChanged() 方法可以实时更新数据;
  3. 借助 setLayoutDirection() 方法可以动态调整内容展示方位,从左到右或从右到左;

此时感觉 ViewPager2 真的很方便,尤其是实时更新数据和动态调整切换方向,真香!

代码语言:javascript
复制
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 属性,实际很久以前就有了,根据设置内容居左或居右;

  1. 需要 AndroidManifest->application 中添加 android:supportsRtl="true" 属性;
  2. 内边距和外边距建议设置 start/end 方式;
  3. ViewPager2 中设置 setLayoutDirection 时,整个 ViewPager2 不仅子 item 内容反向,整体也反向;只有子 item 设置 setLayoutDirection 时会反向。

小结

和尚在学习过程中发现 ViewPager2 确实有很大优势,只是目前还没有发布到正式版,而且对于版本适配也会有一定难度,对于 Fragment 的懒加载与预加载还有待研究;但是学习体验一下还是很有帮助的!


如果有不对的地方还希望多多指出。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿策小和尚 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优势
  • 版本
  • 问题
  • 解决
  • 尝试
  • 扩展
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档