Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

LwkCoder/ViewPagerAdapter

Open more actions menu

Repository files navigation

ViewPagerAdapter

【不再维护,如有bug、需求,请自行clone源码修改】

ViewPager通用适配器

该适配器简化了使用ViewPager时创建适配器的工作,支持子Item布局不一样的情况,且内部实现了Holder复用和状态缓存恢复功能。

引用方式

最新版本请查看这里,替换掉下方的last-version

dependencies {
   #迁移到MavenCentral后引用方式如下:
   implementation 'com.lwkandroid.library:ViewPagerAdapter:last-version'
}

VPSingleItemAdapter:子Item样式一致的适配器

继承VPSingleItemAdapter并在泛型指定数据类型即可

public class TestSingleAdapter extends VPSingleItemAdapter<String>
{
    public TestSingleAdapter(Context context, List<String> dataList)
    {
        super(context, dataList);
    }

    @Override
    public VPHolder onCreateViewHolder(ViewGroup parent)
    {
       //创建ViewHolder的地方
       //可以选择引用布局来创建:createHolderFromLayout(Context context,ViewGroup parent,int layoutId)
       //也可选择引用View来创建:createHolderFromView(Context context, View view)
       
        return createHolderFromLayout(getContext(), parent, R.layout.adapter_item_view01);
    }

    @Override
    public void onBindView(VPHolder holder, String s, int position)
    {
        //绑定视图和数据的方法
        holder.setTvText(R.id.tv_adapter01, s);
    }
}

VPMultiItemAdapter:子Item样式不一致的适配器

需要分别创建不同样式的ItemView,然后关联到适配器中

//继承VPBaseItemView并在泛型指定数据类型,创建第一种样式的ItemView
public class TestItemView01 extends VPBaseItemView<TestData>
{
    public TestItemView01(Context context, VPMultiItemAdapter<TestData> mAdapter)
    {
        super(context, mAdapter);
    }

    @Override
    public boolean isForViewType(TestData item, int position)
    {
        //这里写引用该样式的判断条件
        return item.getType() == 0;
    }

    @Override
    public VPHolder onCreateViewHolder(ViewGroup parent)
    {
       //创建ViewHolder的地方
       //可以选择引用布局来创建:createHolderFromLayout(Context context,ViewGroup parent,int layoutId)
       //也可选择引用View来创建:createHolderFromView(Context context, View view)
        return createHolderFromLayout(getAdapter().getContext(), parent, R.layout.adapter_item_view01);
    }

    @Override
    public void onBindView(VPHolder holder, TestData testData, int position)
    {
        //绑定视图和数据的方法
        holder.setTvText(R.id.tv_adapter01, testData.getData());
    }
}

//继承VPBaseItemView并在泛型指定数据类型,创建第一种样式的ItemView
public class TestItemView02 extends VPBaseItemView<TestData>
{
    public TestItemView02(Context context, VPMultiItemAdapter<TestData> mAdapter)
    {
        super(context, mAdapter);
    }

    @Override
    public boolean isForViewType(TestData item, int position)
    {
        //这里写引用该样式的判断条件
        return item.getType() == 1;
    }

    @Override
    public VPHolder onCreateViewHolder(ViewGroup parent)
    {
       //创建ViewHolder的地方
       //可以选择引用布局来创建:createHolderFromLayout(Context context,ViewGroup parent,int layoutId)
       //也可选择引用View来创建:createHolderFromView(Context context, View view)
        return createHolderFromLayout(getAdapter().getContext(), parent, R.layout.adapter_item_view01);
    }

    @Override
    public void onBindView(VPHolder holder, TestData testData, int position)
    {
        //绑定视图和数据的方法
        holder.setTvText(R.id.tv_adapter02, testData.getData());
    }
}

//继承VPMultiItemAdapter并在泛型指定数据类型
public class TestMultiAdapter extends VPMultiItemAdapter<TestData>
{
    public TestMultiAdapter(Context context, List<TestData> dataList)
    {
        super(context, dataList);
    }

    @Override
    public VPBaseItemView<TestData>[] createAllItemViews()
    {
        //将两种样式的item关联进来即可
        TestItemView01 itemView01 = new TestItemView01(getContext(), this);
        TestItemView02 itemView02 = new TestItemView02(getContext(), this);
        return new VPBaseItemView[]{itemView01, itemView02};
    }
}

VPFragmentPagerAdapter/VPFragmentStatePagerAdapter

这两个适配器其实是对FragmentPagerAdapter/FragmentStatePagerAdapter的优化,是从鴻洋的一篇推文中学习到的,相关连接请点我,以FragmentStatePagerAdapter示例如下:

public class TestStatePagerAdapter extends VPFragmentStatePagerAdapter
{
    public TestStatePagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment createFragment(int position)
    {
        //这里需要根据位置来初始化Fragment
        return TestFragment.createInstance(position);
    }

    @Override
    public int getCount()
    {
        //这里需要指定Pager的数量
        return 500;
    }
}

Proguard混淆

无须特别混淆规则

感谢

状态缓存恢复参考的该项目:ViewStatePagerAdapter

About

ViewPager通用适配器

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.