简单易懂,一步一步带你灵活运用ViewPager

2024-06-02 11:58

本文主要是介绍简单易懂,一步一步带你灵活运用ViewPager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ViewPager概念

ViewPager是google SDK V4包中自带的一个视图类。主要作用:可以用来实现多个屏幕间的切换。

常用方法介绍

1.setAdapter(PagerAdapter adapter)

设置一个PagerAdapter,它将根据需要为这个页面提供视图

2.setCurrentItem(int item)

设置当前选定页面。如果viewPager已经通过它的当前设配器完成了它的第一个布局,那么当前item和指定item之间将会有一个平滑的动画过滤。

3.setOffscreenPageLimit(int limit)

在空闲状态下,在视图次结果中,设置应该保留到当前页面两侧的页面数量。超过这个限制的页面将要在需要时从适配器中重新创建。

4.addOnPageChangeListener(ViewPager.OnPageChangeListener listener)

增加一个监听器,每当页面发生变化或者不断的滑动时,都会被调用。

5.removeOnPageChangeListener(ViewPager.OnPageChangeListener listener)

删除之前通过addOnPageChangeListener(OnPageChangeListener)添加的监听器。

ViewPager入门实例讲解(每行代码都有注释,看着注释基本会懂意思。)

实现步骤:

1.在主布局文件里加入VierPager控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /></RelativeLayout>

2.新建三个布局文件,用来滑动切换视图

layout1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"></LinearLayout>

layout2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffff00"></LinearLayout>

layout3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ff00ff"></LinearLayout>

3.Java代码实现

public class ViewPagerActivity extends AppCompatActivity {private  ViewPager viewPager;     //对应的ViewPager控件private  View view1,view2,view3;  //对应的三个Viewprivate  List<View> viewList;     //View数组@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_pager);initView();initData();}/*** 初始化控件*/private void initView() {viewPager = findViewById(R.id.viewPager);LayoutInflater inflater=getLayoutInflater();view1=inflater.inflate(R.layout.layout1,null);view2=inflater.inflate(R.layout.layout2,null);view3=inflater.inflate(R.layout.layout3,null);}/*** 设置数据*/private void initData() {//添加三个布局文件viewList=new ArrayList<>();viewList.add(view1);viewList.add(view2);viewList.add(view3);//设置适配器viewPager.setAdapter(pagerAdapter);}//初始化PagerAdapter设配器PagerAdapter pagerAdapter=new PagerAdapter(){//返回要滑动的View的个数@Overridepublic int getCount() {return viewList.size();}//判断当前的View是否是instantiateItem添加的View@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view==object;}//从当前container中删除指定位置(position)的View;@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView(viewList.get(position));}//第一:将当前视图添加到container中,第二:返回当前View@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {container.addView(viewList.get(position));return viewList.get(position);}};
}

ViewPager进阶实例讲解

注:这是在入门实例基础上进阶的实例(使用Fragment实现ViewPager滑动页面)。

实现步骤:

  1. 实现设配器(FragmentPagerAdapter 或者 FragmentStatePagerAdapter)

注:FragmentPagerAdapter 和 FragmentStatePagerAdapter都是PagerAdapter的子类。主要的区别:FragmentStatePagerAdapter处理大量的页面切换,而FragmentPagerAdapter处理有限个静态Fragment页面。我们这里就使用FragmentStatePagerAdapter做讲解。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import java.util.List;public class FragAdapter extends FragmentStatePagerAdapter {private List<Fragment> mFragments;//Fragment数组,用于保存用于滑动的Fragment对象public FragAdapter(FragmentManager fm,List<Fragment> fragments) {super(fm);mFragments=fragments;}//返回指定位置关联的Fragment@Overridepublic Fragment getItem(int position) {return mFragments.get(position);}//返回用于滑动的Fragment总数@Overridepublic int getCount() {return mFragments.size();}
}
  1. 新建三个fragment类

2.1第一个Fragment

XML(layout1.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"></LinearLayout>

JAVA代码

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.lenovo.androidtest.R;public class Fragment1 extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.layout1, container, false);}
}

2.2第二个Fragment

XML(layout2.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffff00"></LinearLayout>

JAVA代码

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.example.lenovo.androidtest.R;public class Fragment2 extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.layout2, container, false);}
}

2.3第三个Fragment

XML(layout3.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ff00ff"></LinearLayout>

JAVA代码

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.example.lenovo.androidtest.R;public class Fragment3 extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.layout3, container, false);}
}

注:其实大家发现没有,相对于入门级的布局文件,只是多了三个Fragment类来加载三个页面。

  1. Activity代码实现
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import com.example.lenovo.androidtest.R;
import com.example.lenovo.androidtest.adapter.FragAdapter;
import com.example.lenovo.androidtest.fragment.Fragment1;
import com.example.lenovo.androidtest.fragment.Fragment2;
import com.example.lenovo.androidtest.fragment.Fragment3;import java.util.ArrayList;
import java.util.List;public class ViewPagerFragmentActivity extends AppCompatActivity {ViewPager vp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_pager_fragment);initView();initData();}private void initView() {vp = findViewById(R.id.all_viewPage); //获取viewpage控件}private void initData() {List<Fragment> fragments=new ArrayList<>(); //构建一个Fragment列表//将三个Fragment实例添加到List中fragments.add(new Fragment1());  fragments.add(new Fragment2());fragments.add(new Fragment3());//生成一个FragAdapter实例FragAdapter adapter = new FragAdapter(getSupportFragmentManager(), fragments);//设定适配器vp.setAdapter(adapter);}
}

总结:其实进阶的实例只是在入门实例上用Fragment实现了同样的效果。上面的实例注意了,一定要导入V4包里面的Fragment。不然的话,List添加实例的时候会提示“无法将Fragment()转换为fragment”。

ViewPager应用(ViewPager+Fragment+TabLayout+RecyclerView)

注:现在就是带你实现平时我们开发中用得最多的黄金搭配了。ViewPager+Fragment+TabLayout+RecyclerView最强组合。

实现步骤:

1.1.新建Fragment布局文件(fragment_item_list)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView 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:id="@+id/list"android:name="com.example.lenovo.androidtest.fragment.ItemFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"app:layoutManager="LinearLayoutManager"tools:context=".fragment.ItemFragment"tools:listitem="@layout/fragment_item" />

1.2新建Fragment类(ItemFragment)

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.lenovo.androidtest.R;
import com.example.lenovo.androidtest.fragment.dummy.DummyContent;public class ItemFragment extends Fragment {// 对应页面标识名称private static final String ARG_COLUMN_COUNT = "column-count";// 对应页面标识private int mColumnCount = 1;public ItemFragment() {}//实例化ItemFragment,并且传入标识参数@SuppressWarnings("unused")public static ItemFragment newInstance(int columnCount) {ItemFragment fragment = new ItemFragment();Bundle args = new Bundle();args.putInt(ARG_COLUMN_COUNT, columnCount);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);//获取标识参数}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_item_list, container, false);if (view instanceof RecyclerView) { //判断是否是RecyclerView控件Context context = view.getContext();RecyclerView recyclerView = (RecyclerView) view;//如果参数值小于等于1,就设置为线型列表,否则就是设置表格列表if (mColumnCount <= 1) {recyclerView.setLayoutManager(new LinearLayoutManager(context));} else {recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));}//设置列表设配器recyclerView.setAdapter(new MyItemRecyclerViewAdapter(DummyContent.ITEMS));}return view;}
}

2.1添加RecyclerView适配器(布局文件我就不写了)

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.lenovo.androidtest.R;
import com.example.lenovo.androidtest.fragment.dummy.DummyContent.DummyItem;
import java.util.List;public class MyItemRecyclerViewAdapter extends RecyclerView.Adapter<MyItemRecyclerViewAdapter.ViewHolder> {private final List<DummyItem> mValues;public MyItemRecyclerViewAdapter(List<DummyItem> items) {mValues = items;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(final ViewHolder holder, int position) {holder.mItem = mValues.get(position);holder.mIdView.setText(mValues.get(position).id);holder.mContentView.setText(mValues.get(position).content);}@Overridepublic int getItemCount() {return mValues.size();}public class ViewHolder extends RecyclerView.ViewHolder {public final View mView;public final TextView mIdView;public final TextView mContentView;public DummyItem mItem;public ViewHolder(View view) {super(view);mView = view;mIdView = (TextView) view.findViewById(R.id.item_number);mContentView = (TextView) view.findViewById(R.id.content);}@Overridepublic String toString() {return super.toString() + " '" + mContentView.getText() + "'";}}
}

3.1Activity核心代码

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.lenovo.androidtest.R;
import com.example.lenovo.androidtest.common.TabFragmentIndex;
import com.example.lenovo.androidtest.fragment.FragmentAdapter;
import com.example.lenovo.androidtest.fragment.ItemFragment;
import java.util.ArrayList;
import java.util.List;public class NewParentActivity extends AppCompatActivity{private ViewPager mViewpager;                               //ViewPager控件private TabLayout mTabLayout;                               //TabLayout控件private String[] tabs = new String[]{"首页","推荐","热点"}; //标题要显示的文字protected List<Fragment> fragments;                         //Fragment的List集合@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test);initView();initData();}/*** 初始化控件*/private void initView() {mTabLayout = findViewById(R.id.tabs);mViewpager = findViewById(R.id.viewpager);}/*** 初始化数据*/private void initData() {fragments = new ArrayList<>(); //实例化fragment集合for (int i = 0; i < tabs.length; i++) {mTabLayout.addTab(mTabLayout.newTab().setText(tabs[i])); //添加Tab,并且设置标题文字//添加三个Fragment实例switch (i) {case 0:fragments.add(ItemFragment.newInstance(0));break;case 1:fragments.add(ItemFragment.newInstance(1));break;case 2:fragments.add(ItemFragment.newInstance(2));break;}}mViewpager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), fragments)); //设置ViewPager设配器mViewpager.setCurrentItem(1);        //设置当前选定页面(这里的值是1,代表初始化是第二个页面)mViewpager.setOffscreenPageLimit(2); //缓存页面个数(这里是缓存了两个页面,)mTabLayout.setupWithViewPager(mViewpager); //建立TabLayout与ViewPager关联,(就是这么牛,一句代码解决关联代码)for (int i = 0; i < tabs.length; i++)mTabLayout.getTabAt(i).setText(tabs[i]);//这个地方主要是解决ViewPager设置设配器的时候,把TabLayout的标题文字给置空问题。}
}

好了,关于ViewPager的入门到应用的实例就到此结束了。有关TabLayout和RecyclerView的介绍,大家可以到网上搜索具体的用法。关于上面的几个实例有什么疑问或者错误,欢迎在评论区留言。

这篇关于简单易懂,一步一步带你灵活运用ViewPager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023902

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c