说明
ViewPager 通过左右滑动实现切换当前View的功能
ViewPage同LinearLayout 和ListView 也是一个容器,需要往里面添加具体内容。
同时也继承ViewGroup,需要通过PagerAdapter实现数据额和界面的连接
步骤
1、需要新建主Layout
res/layout/activity_view_pager.xml
其中tv_vp_one、tv_vp_two、tv_vp_three是为了实现一个和标题互动功能。
主要的还是vp_one
<?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=".ViewPagerActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_vp_one"
android:text="one"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/gray"
/>
<TextView
android:id="@+id/tv_vp_two"
android:text="two"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<TextView
android:id="@+id/tv_vp_three"
android:text="three"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
/>
</LinearLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
2、准备ViewPager的子Layout
view_pager_itm1.xml
view_pager_itm2.xml
view_pager_itm3.xml
三个layout大同小异,就是背景和其中描述不一样,只是为了区分和醒目
在此不一 一展示了只提供view_pager_itm1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="First ViewPage Itm"
android:gravity="center"
android:textSize="36sp"
android:background="@color/green"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
3、准备数据
com/pha/first/ViewPagerActivity.java
新增初始化数据方法InitData();并在onCreat()引用。
这样看着回合前面ListView、RecyclerView的步骤很相似吧。
private void InitData() {
LayoutInflater lfrom = getLayoutInflater().from(this);
View view1 = lfrom.inflate(R.layout.view_pager_itm1,null);
View view2 = lfrom.inflate(R.layout.view_pager_itm2,null);
View view3 = lfrom.inflate(R.layout.view_pager_itm3,null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
}
4、新建Adapter
com/pha/first/adapter/ViewPagerAdapter.java
- 继承PagerAdapter()
- 继承PagerAdapter后报错错,需要分别重写getCount()、isViewFromObject()
- 定义数据viewList(界面需要数据的,数据类型就是List)。由于PageAdapter是显示view,直接就可以使用就没有自定义数据类型
- 构造函数ViewPagerAdapter
在ViewPagerAdapter.java类里alt+insert(部分电脑需要fn+alt+insert) - 重写instantiateltem()
新增构造函数ViewPagerAdapter以后,还是不够的。因为需要将view添加到ViewGroup中,并显示出来
功能解释
instantiateltem()
1.将给定位置的view添加到ViewGroup(容器)中,创建并显示出来
2.返回一个代表新增页面的Objectl(key),通常都是直接返回view本身就可以了,当然你也可以自定义
自己的key,但是key和每个view要一 一对 应的关系 - 重写destroyltem():主要是移除一个指定位置的界面
适配器有责任从容器中删除这个视图。这是为了确保在
finishUpdate(viewGroup)返回时视图能够被移除。
所以
配器ViewPagerAdapter.java最终代码
package com.pha.first.adapter;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
public class ViewPagerAdapter extends PagerAdapter {
private List<View> viewList;
public ViewPagerAdapter(List<View> viewList) {
this.viewList = viewList;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(viewList.get(position),0);
return viewList.get(position);
}
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(viewList.get(position));
}
}
5、展示ViewPager
文件com/pha/first/ViewPagerActivity.java 中间新建ShowViewPager,并在onCreat 中调用
private void ShowViewPager() {
vp_one = findViewById(R.id.vp_one);
vp_one.setAdapter(new ViewPagerAdapter(viewList));
}
到这基本就实现了ViewPager的简单使用了。
为了更近的一步的使用,做了一个类似web前台界面页签功能。
在res/layout/activity_view_pager.xml其中tv_vp_one、tv_vp_two、tv_vp_three等元素都是为了这做准备。
Add part :
-
ViewPagerActivity.java 继承 View.OnClickListener。
主要是为了简写TextView 的点击监听事件
也会重写 onClick(View) 方法 -
增加tv_vp_one、tv_vp_two、tv_vp_three的监听事件
1、onCreat中新增
findViewById(R.id.tv_vp_one).setOnClickListener(this);
findViewById(R.id.tv_vp_two).setOnClickListener(this);
findViewById(R.id.tv_vp_three).setOnClickListener(this);
2、修改onClick方法
注意
vp_one.setCurrentItem(Int); 是ViewPager 的切换界面
@Override
public void onClick(View view) {
InitBackground(view);
switch (view.getId()){
case R.id.tv_vp_one:
vp_one.setCurrentItem(0);
break;
case R.id.tv_vp_two:
vp_one.setCurrentItem(1);
break;
case R.id.tv_vp_three:
vp_one.setCurrentItem(2);
break;
default:
break;
}
}
3、新增InitBackground()
主要是ViewPager 的切换界面时,TextView也相应变换
private void InitBackground(View view) {
findViewById(R.id.tv_vp_one).setBackgroundResource(R.color.white);
findViewById(R.id.tv_vp_two).setBackgroundResource(R.color.white);
findViewById(R.id.tv_vp_three).setBackgroundResource(R.color.white);
view.setBackgroundResource(R.color.gray);
}
4、增加ViewPager 的切换时的监听事件
这部分修改为将他放在了展示ViewPager方法中。
//添加ViewPager更换的监听事件,为了和上面的TextView 联动
vp_one.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position){
case 0:
InitBackground(findViewById(R.id.tv_vp_one));
break;
case 1:
InitBackground(findViewById(R.id.tv_vp_two));
break;
case 2:
InitBackground(findViewById(R.id.tv_vp_three));
break;
default:
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
ViewPagerActivity.java最终代码
package com.pha.first;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import com.pha.first.adapter.ViewPagerAdapter;
import java.util.ArrayList;
import java.util.List;
public class ViewPagerActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "ViewPager";
private List<View> viewList = new ArrayList<>();
private ViewPager vp_one;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
// 初始化view
InitData();
// 展示
ShowViewPager();
findViewById(R.id.tv_vp_one).setOnClickListener(this);
findViewById(R.id.tv_vp_two).setOnClickListener(this);
findViewById(R.id.tv_vp_three).setOnClickListener(this);
}
private void ShowViewPager() {
vp_one = findViewById(R.id.vp_one);
vp_one.setAdapter(new ViewPagerAdapter(viewList));
//添加ViewPager更换的监听事件,为了和上面的TextView 联动
vp_one.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position){
case 0:
InitBackground(findViewById(R.id.tv_vp_one));
break;
case 1:
InitBackground(findViewById(R.id.tv_vp_two));
break;
case 2:
InitBackground(findViewById(R.id.tv_vp_three));
break;
default:
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void InitData() {
LayoutInflater lfrom = getLayoutInflater().from(this);
View view1 = lfrom.inflate(R.layout.view_pager_itm1,null);
View view2 = lfrom.inflate(R.layout.view_pager_itm2,null);
View view3 = lfrom.inflate(R.layout.view_pager_itm3,null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
}
@Override
public void onClick(View view) {
InitBackground(view);
switch (view.getId()){
case R.id.tv_vp_one:
vp_one.setCurrentItem(0);
break;
case R.id.tv_vp_two:
vp_one.setCurrentItem(1);
break;
case R.id.tv_vp_three:
vp_one.setCurrentItem(2);
break;
default:
break;
}
}
private void InitBackground(View view) {
findViewById(R.id.tv_vp_one).setBackgroundResource(R.color.white);
findViewById(R.id.tv_vp_two).setBackgroundResource(R.color.white);
findViewById(R.id.tv_vp_three).setBackgroundResource(R.color.white);
view.setBackgroundResource(R.color.gray);
}
}
效果图
点击上面的one、two、three,下面的内容同时相应的变化。
滑动下面的内容,上面的one、two、three也相应的变化
- 底部导航的切换–ViewPager结合Fragment。
-这个问题后续会学到,所以还需要继续学习啊