android——初次尝试ViewPager,适配器PagerAdapter详解

说道ViewPager,这是每个app都存在的常用控件之一,它从android3.0开始出现,多用于App的首页部分,今天便来探究一下ViewPager,先上效果图:

android——初次尝试ViewPager,适配器PagerAdapter详解

首先说一下ViewPager的机制:viewpager有三个适配器,pagerAdapter,FragmentpagerAdapter,FragmentStatePagerAdapter

第一个pagerAdapter是普通的pager适配器,操作方便,结构和功能大概和recyclerView的适配器类似,

第二个FragmentPagerAdapter是用于碎片的适配器,这个适配器相比第三种FragmentStatePagerAdapter来说,更适合界面少的情况,因为这个适配器会缓存当前页面在内的左右共三个界面,实现快速展示,但是界面多的时候则会占用大部分资源,而FragmentStatePagerAdapter正好相反。

这里首先讲一下PagerAdapter,这个适配器中有四个方法:

public int getCount()

这与RecyclerView适配器中的getItemCount是一样的,用于确认子项的数量;

public boolean isViewFromObject(@NonNull View view, @NonNull Object object) 

这个方法是确定当前view的key的,为了保持一致一半都直接返回view==object

public Object instantiateItem(@NonNull ViewGroup container, int position)

这个方法相当于RecyclerView中的onBindView,给当前的页面“赋值”;

public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object)

这个方法相当于RecyclerView中的adapter.notifyremoved,当页面左右滑动时,移除消失的view;

这里我只用了两个界面,当然还可以存在三个四个甚至更多。

现在上代码:

package com.example.administrator.testviewpager;

import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private List<View> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = findViewById(R.id.viewpager);
        LayoutInflater layoutInflater = getLayoutInflater();
        list.add(layoutInflater.inflate(R.layout.layout_one, null, false));
        list.add(layoutInflater.inflate(R.layout.layout_two, null, false));
        viewPager.setAdapter(new PagerAdapter());
    }

    private class PagerAdapter extends android.support.v4.view.PagerAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            container.addView(list.get(position));
            return list.get(position);
        }

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView(list.get(position));
        }
    }
}

也不用过多解释,整个流程非常简单,用list加载两个布局,实现切换,然而现实中的viewPager所用不止这么简单,会在之后的实践中记录更多的使用方法;

我是分割线--------------------------------------------------------------------------------------------------------------------

这里我觉得很有必要要说一下isViewFromObject这个方法中的key和Object的关系,上面的方法中,key就是view,我们知道key是代表了每一个单独的页面,而页面就是key所对应的值,而这个object则是从instantiateItem这个方法中返回而来的