viewPager + recycleView 实现左右滑动


<?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="280dp">

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:id="@+id/viewpage">

    </android.support.v4.view.ViewPager>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:id="@+id/oval_layout"
        >

    </LinearLayout>

</LinearLayout>

下面为recycleAdapter的代码

public class RecycleViewAdapter extends RecyclerView.Adapter {
    private List<Model> list;//model类中有两个属性以及其get和set方法
    private int page;
    private int row;
    public RecycleViewAdapter(List<Model> list,int page,int row) {
        this.list=list;
        this.page=page;
        this.row=row;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.data, parent, false);
        MyHodler hodler = new MyHodler(view);
        return hodler;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyHodler myHodler=(MyHodler)holder;
        myHodler.imageView.setImageResource(list.get(position+(page-1)*10).getId());
        myHodler.textView.setText(list.get(position+(page-1)*10).getName());

    }

    @Override
    public int getItemCount() {
        return list.size()>page*row*5?row*5:(list.size()-(page-1)*row*5);
    }

    class MyHodler extends RecyclerView.ViewHolder{
        TextView textView;
        ImageView imageView;
        public MyHodler(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.name);
            imageView = (ImageView) itemView.findViewById(R.id.image);
        }
    }
}

接下来是ViewPagerAdapter的代码

public class ViewPageAdapter extends PagerAdapter {
    private List<View> list;//这个是保存了RecycleView

    public ViewPageAdapter(List<View> list) {
        this.list=list;
    }
    @Override
    public int getCount() {
        return list.size();
    }

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

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

        container.removeView(list.get(position));
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      /*  for (View view : list) {
            ViewGroup parent=(ViewGroup)view.getParent();
            if (parent != null) {
                parent.removeView(view);
            }
        }*/
        //解决The specified child already has a parent. You must call removeView() on the child's parent first.
        ViewGroup parent=(ViewGroup)list.get(position).getParent();
        if (parent != null) {
            parent.removeView(list.get(position));
        }
        container.addView(list.get(position));
        return list.get(position);
    }
}
 
最后是mainavtivity
public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;

    private int prePosition=0;
    private LinearLayout linearLayout;
    private ViewPager viewPager;
    private  int pagecount;
    private ArrayList<Model> list=new ArrayList<>();
    private ArrayList<View> listsView=new ArrayList<>();
    private RecycleViewAdapter recycleViewAdapter;
    private String[] titles = {"美食", "电影", "酒店住宿", "休闲娱乐", "外卖", "自助餐", "KTV", "机票/火车票", "周边游", "美甲美睫",
            "火锅", "生日蛋糕", "甜品饮品", "水上乐园", "汽车服务", "美发", "丽人", "景点", "足疗按摩", "运动健身", "健身", "超市", "买菜",
            "今日新单", "小吃快餐", "面膜", "洗浴/汗蒸", "母婴亲子", "生活服务", "婚纱摄影", "学习培训", "家装", "结婚", "全部分配"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_page);

        viewPager = (ViewPager) findViewById(R.id.viewpage);
        /*View view= LayoutInflater.from(this).inflate(R.layout.recycle_view, viewPager, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.recycle);
        recyclerView.setLayoutManager(new GridLayoutManager(this,5));*/
        linearLayout = (LinearLayout) findViewById(R.id.oval_layout);
        initdata();
         pagecount=(int)(titles.length/10)+1;
        Log.d("test", pagecount+":pagecount");
        //根据适配器的不同添加不同的recycleview
        //*********并且为每个页面都inflate出实例

        for (int i=1;i<=pagecount;i++){
            View view= LayoutInflater.from(this).inflate(R.layout.recycle_view, viewPager, false);
            recyclerView = (RecyclerView) view.findViewById(R.id.recycle);
            recyclerView.setLayoutManager(new GridLayoutManager(this,5));

            recycleViewAdapter = new RecycleViewAdapter(list, i, 2);
            recyclerView.setAdapter(recycleViewAdapter);
            listsView.add(recyclerView);
        }
        //如果同时添加两个名字为view1的则滑动的时候会报错
        //The specified child already has a parent. You must call removeView() on the child's parent first.
        /*View view = LayoutInflater.from(this).inflate(R.layout.oval_view, viewPager, false);
        View view1 = LayoutInflater.from(this).inflate(R.layout.content_main, viewPager, false);
        View view2 = LayoutInflater.from(this).inflate(R.layout.text, viewPager, false);
        View view3 = LayoutInflater.from(this).inflate(R.layout.text, viewPager, false);
        listsView.add(view3);
        listsView.add(view);
        listsView.add(view2);
        listsView.add(view1);*/

        viewPager.setAdapter(new ViewPageAdapter(listsView));
        viewPager.setPageTransformer(true,new MyPageTransformor());
        setOval();
        mhandle.sendEmptyMessageDelayed(1, 1000);
    }
    public void initdata(){
        //动态获取资源ID,第一个参数是资源名,第二个参数是资源类型例如drawable,string等,第三个参数包名
        for (int i=0;i<titles.length;i++) {
            list.add(new Model(titles[i], getResources().getIdentifier("ic_category_" + i, "mipmap", getPackageName())));
        }
    }
    public void setOval(){//这个是设置滑动页面时下面的小圆会跟着滑动

        //将oval_view添加到linearlayout中
        for (int i=0;i<pagecount;i++) {

            linearLayout.addView(LayoutInflater.from(this).inflate(R.layout.oval_view,null));
        }
        //好多个错误
        //1当子view有parent的时候用addview将view添加到一个容器中会有错
        //解决办法将整个子view所在的layout添加到另一个layout中
        linearLayout.getChildAt(0).findViewById(R.id.oval_no_select).setBackgroundResource(R.drawable.oval_select);
        //2当滑动页面的时候没有出现小圆点变现
        //解决办法:找到小圆点layout。通过layout找到小圆点,直接改变小圆点的颜色
        //之前是linearLayout.getChildAt(0).setBackgroundResource(R.drawable.oval_select);
        //改变的只是layout的颜色
        //3,页面滑动的时候颜色没有改变
        //将要改变颜色的代码放入onPageSelected中
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


                Log.d("test", positionOffset + "positionOffset");
            }

            @Override
            public void onPageSelected(int position) {
                linearLayout.getChildAt(position).findViewById(R.id.oval_no_select).
                        setBackgroundResource(R.drawable.oval_select);
                linearLayout.getChildAt(prePosition).findViewById(R.id.oval_no_select).
                        setBackgroundResource(R.drawable.oval_1);
                prePosition=position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                        flag=false;
                        break;
                    case ViewPager.SCROLL_STATE_IDLE:
                        flag=true;
                        break;
                }
            }
        });


    }

    @Override
    protected void onResume() {
        super.onResume();

    }
    private Handler mhandle=new Handler() {

        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 1:
                    int current=(position)%pagecount;

                    viewPager.setCurrentItem(current,true);
                    position++;
                    break;
                case 2:
                    position++;
                    break;

            }
        }
    };
    class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            while (true) {
                Message message=new Message();
                if (flag)
                    message.what=1;
                else
                    message.what=2;
                mhandle.sendMessage(message);
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {

                }
            }
        }
    }
    boolean   flag=true;
    private int position=0;


}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现ViewPager中Fragment的无限循环,可以采用以下几个步骤: 1.在ViewPager的Adapter中重写getCount()方法,将其返回一个较大的值,例如Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。 2.在ViewPager的Adapter中重写getItem()方法,将其返回的position取模操作,以确保获取到正确的Fragment。 3.在ViewPager的Adapter中重写getPageTitle()方法,将其返回的title也进行取模操作,以确保获取到正确的title。 下面是一个示例代码: ```java public class MyPagerAdapter extends FragmentPagerAdapter { private static final int NUM_PAGES = 3; private List<Fragment> fragmentList; private List<String> titleList; public MyPagerAdapter(FragmentManager fm) { super(fm); fragmentList = new ArrayList<>(); titleList = new ArrayList<>(); for (int i = 0; i < NUM_PAGES; i++) { fragmentList.add(new MyFragment()); titleList.add("Page " + (i + 1)); } } @Override public Fragment getItem(int position) { return fragmentList.get(position % NUM_PAGES); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public CharSequence getPageTitle(int position) { return titleList.get(position % NUM_PAGES); } } ``` 在上面的示例代码中,我们将ViewPager中的Fragment数量设置为3,然后在getCount()方法中返回一个较大的值Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。在getItem()和getPageTitle()方法中,我们对position取模操作,以确保获取到正确的Fragment和title。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值