Android ViewPager2总结

ViewPager2总结

概述

ViewPager2是一个增强版的ViewPager,ViewPager2是基于RecyclerView+PagerSnapHelper实现的,解决了ViewPager的一些弊端,同时加入一些新特性。

常用API

//设置分页方向
setOrientation(@Orientation int orientation)

//定位指定页面
setCurrentItem(int item)  
setCurrentItem(int item, boolean smoothScroll)

//设置预加载页数
setOffscreenPageLimit(@OffscreenPageLimit int limit)

//禁止滑动
setUserInputEnabled(boolean enabled) 

//模拟滑动
beginFakeDrag()
fakeDragBy(float offsetPxFloat)
//停止模拟
endFakeDrag()


//全部刷新
notifyDataSetChanged();
//局部刷新
notifyItemChanged(int position)

//监听页面变化
registerOnPageChangeCallback(@NonNull OnPageChangeCallback callback)
//删除监听
unregisterOnPageChangeCallback(@NonNull OnPageChangeCallback callback) 

ViewPager2实现引导页

在这里插入图片描述

GuideAdapter

public class GuideAdapter extends RecyclerView.Adapter<GuideAdapter.MyViewHolder> {
    
    

    private final LayoutInflater inflater;
    private final int[] mImgIds;

    public GuideAdapter(Context context, int[] imgIds) {
    
    
        inflater = LayoutInflater.from(context);
        mImgIds = imgIds;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        return new MyViewHolder(inflater.inflate(R.layout.item_guide, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    
    
        holder.imageView.setImageResource(mImgIds[position]);
    }

    @Override
    public int getItemCount() {
    
    
        return mImgIds.length;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
    
    
        private final ImageView imageView;

        public MyViewHolder(@NonNull View itemView) {
    
    
            super(itemView);
            imageView = (ImageView) itemView;
        }
    }
}

GuideActivity

public class GuideActivity extends AppCompatActivity {
    
    
    private int[] imgIds = {
    
    R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4};
    private LinearLayout indicator;
    private LinearLayout indicator2;
    private ViewPager2 viewPager2;
    private ArrayList<View> dotList;
    private Context context;
    private int distance;
    private View point;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        context = this;
        initViews();
        initData();

        indicator2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
    
            @Override
            public void onGlobalLayout() {
    
    
                indicator2.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                distance = indicator2.getChildAt(1).getLeft() - indicator2.getChildAt(0).getLeft();
            }
        });

        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
    
    
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
    
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                int leftMargin = (int) (distance * (position + positionOffset));
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) point.getLayoutParams();
                params.leftMargin = leftMargin;
                point.setLayoutParams(params);
            }

            @Override
            public void onPageSelected(int position) {
    
    
                super.onPageSelected(position);
                for (int i = 0; i < dotList.size(); i++) {
    
    
                    if (i == position) {
    
    
                        dotList.get(i).setSelected(true);
                    } else {
    
    
                        dotList.get(i).setSelected(false);
                    }
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
    
    
                super.onPageScrollStateChanged(state);
            }
        });
    }

    private void initViews() {
    
    
        indicator = findViewById(R.id.indicator);
        indicator2 = findViewById(R.id.indicator2);
        viewPager2 = findViewById(R.id.viewPager2);
        point = findViewById(R.id.point);

        GuideAdapter mAdapter = new GuideAdapter(this, imgIds);
        viewPager2.setAdapter(mAdapter);
    }

    private void initData() {
    
    
        int width = UiUtils.dp2px(context, 10);

        for (int i = 0; i < imgIds.length; i++) {
    
    
            View dot = new View(context);
            dot.setBackgroundResource(R.drawable.shape_dot_normal);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, width);
            if (i != 0) {
    
    
                params.leftMargin = width;
            }
            dot.setLayoutParams(params);
            indicator.addView(dot);
        }

        dotList = new ArrayList<>(imgIds.length);
        for (int i = 0; i < imgIds.length; i++) {
    
    
            View dot = new View(context);
            dot.setBackgroundResource(R.drawable.selector_dot);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, width);
            if (i != 0) {
    
    
                params.leftMargin = width;
            } else {
    
    
                dot.setSelected(true);
            }
            dot.setLayoutParams(params);
            indicator2.addView(dot);
            dotList.add(dot);
        }
    }
}

ViewPager2+Fragment+TabLayout

在这里插入图片描述

XML布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".tabs.TabActivity">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorColor="#ff0000"
        app:tabIndicatorFullWidth="true"
        app:tabMode="fixed"
        app:tabSelectedTextColor="#ff0000"
        app:tabTextColor="@color/black" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

SimpleFragment

public class SimpleFragment extends Fragment {
    
    

    private String desc;

    public static SimpleFragment newInstance(String desc) {
    
    
        SimpleFragment fragment = new SimpleFragment();
        Bundle args = new Bundle();
        args.putString("desc", desc);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
    
    
            desc = getArguments().getString("desc");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
    
        return inflater.inflate(R.layout.fragment_simple, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    
    
        super.onViewCreated(view, savedInstanceState);
        TextView content = view.findViewById(R.id.content);
        content.setText(desc);
    }
}

TabActivity

public class TabActivity extends AppCompatActivity {
    
    

    private ViewPager2 viewPager2;
    private TabLayout tabLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab);
        viewPager2 = findViewById(R.id.viewPager2);
        tabLayout = findViewById(R.id.tabLayout);

        ArrayList<SimpleFragment> fragmentList = new ArrayList<>();
        fragmentList.add(SimpleFragment.newInstance("AAA"));
        fragmentList.add(SimpleFragment.newInstance("BBB"));
        fragmentList.add(SimpleFragment.newInstance("CCC"));
        fragmentList.add(SimpleFragment.newInstance("DDD"));
        ArrayList<String> titleList = new ArrayList<>();
        titleList.add("One");
        titleList.add("Two");
        titleList.add("Three");
        titleList.add("Four");

        TabAdapter mAdapter = new TabAdapter(this, fragmentList);
        viewPager2.setAdapter(mAdapter);

        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
    
    
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
    
    
                tab.setText(titleList.get(position));
            }
        }).attach();
    }
}

TabAdapter

public class TabAdapter extends FragmentStateAdapter {
    
    

    private final ArrayList<SimpleFragment> mFragmentList;

    public TabAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList<SimpleFragment> fragmentList) {
    
    
        super(fragmentActivity);
        mFragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
    
    
        return mFragmentList.get(position);
    }

    @Override
    public int getItemCount() {
    
    
        return mFragmentList.size();
    }
}

代码下载

猜你喜欢

转载自blog.csdn.net/qq_14876133/article/details/114083166