说道ViewPager,这是每个app都存在的常用控件之一,它从android3.0开始出现,多用于App的首页部分,今天便来探究一下ViewPager,先上效果图:
首先说一下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这个方法中返回而来的