zoukankan      html  css  js  c++  java
  • RecycleView实现轮播图

    学了好久,终于实现了。分享一下代码吧。

    <?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">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <include
            layout="@layout/titlebar_home" />
        </LinearLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_marginLeft="@dimen/horizontal_dimen_10dp"
            android:layout_marginRight="@dimen/horizontal_dimen_10dp"
            android:layout_height="wrap_content">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:layout_alignParentStart="true"
                android:layout_marginStart="0dp"></android.support.v7.widget.RecyclerView>
    
            <com.example.bs.Home.BannerIndicator
                android:id="@+id/indicator"
                android:layout_width="match_parent"
                android:layout_height="32dp"
                android:layout_alignBottom="@+id/recycler"
                app:selectColor="@color/colorAccent"
                app:unselectedColor="#ffffff"
                app:radius="3dp"
                app:space="10dp"/>
        </RelativeLayout>
    
    
    </LinearLayout>

    ------------------------------------------------------------

    package com.example.bs.Home;
    
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    
    import com.bumptech.glide.Glide;
    import com.example.bs.R;
    
    import java.util.List;
    
    public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.ViewHolder> {
    
        private List<Integer> list;
        private Context context;
    
        public BannerAdapter(Context context, List<Integer> list){
            this.list=list;
            this.context=context;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image,parent,false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Glide.with(context).load(list.get(position%list.size())).into(holder.imageView);
        }
    
        @Override
        public int getItemCount() {
            return Integer.MAX_VALUE;
        }
    
        class ViewHolder extends RecyclerView.ViewHolder {
            private ImageView imageView;
    
            public ViewHolder(View itemView) {
                super(itemView);
                imageView= (ImageView) itemView.findViewById(R.id.item_image);
            }
    
        }
    }
    

    ----------------------------------------------------------------------------------------------------------

    package com.example.bs.Home;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.View;
    
    import com.example.bs.R;
    
    public class BannerIndicator extends View {
        private int number;
        private int position = 0;
        private Paint paint = new Paint();
        private int selectColor;
        private int unSelectColor;
        private float radius;
        private float space;
    
        public BannerIndicator(Context context) {
            this(context,null);
        }
    
        public BannerIndicator(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerIndicator);
            this.selectColor = typedArray.getColor(R.styleable.BannerIndicator_selectColor, Color.RED);
            this.unSelectColor = typedArray.getColor(R.styleable.BannerIndicator_unselectedColor, Color.BLACK);
            this.radius = typedArray.getDimension(R.styleable.BannerIndicator_radius, 10);
            this.space = typedArray.getDimension(R.styleable.BannerIndicator_space, 20);
            typedArray.recycle();
    
        }
    
        {
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            float startPosition = getWidth() / 2 - (radius * 2 * number + space * (number - 1)) / 2;
    
            canvas.save();
            for (int i = 0; i < number; i++) {
                if (i == position) {
                    paint.setColor(selectColor);
                } else {
                    paint.setColor(unSelectColor);
                }
                canvas.drawCircle(startPosition + radius * (2 * i + 1) + i * space, getHeight() / 2, radius, paint);
            }
            canvas.restore();
    
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    
        public void setPosition(int position) {
            this.position = position;
            invalidate();
        }
    }
    

    ——----------------------------------------------------------------------------

    package com.example.bs.Home;
    
    import android.content.Context;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.LinearSmoothScroller;
    import android.support.v7.widget.RecyclerView;
    import android.util.DisplayMetrics;
    
    /**
     * author Gao
     * date 2017/11/23 0023
     * description
     */
    
    public class SmoothLinearLayoutManager extends LinearLayoutManager {
    
        public SmoothLinearLayoutManager(Context context) {
            super(context);
        }
    
        public SmoothLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
            super(context, orientation, reverseLayout);
        }
    
        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
            LinearSmoothScroller linearSmoothScroller =
                    new LinearSmoothScroller(recyclerView.getContext()) {
                        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
                            return 0.2f;
                        }
                    };
            linearSmoothScroller.setTargetPosition(position);
            startSmoothScroll(linearSmoothScroller);
        }
    
    }
    

    ———————————————————————————————————————————

    package com.example.bs.Home;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.PagerSnapHelper;
    import android.support.v7.widget.RecyclerView;
    
    import com.example.bs.R;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class hom extends AppCompatActivity {
        private List<Integer> list = new ArrayList<>(4);
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_home);
    
            list.add(R.drawable.b1);
            list.add(R.drawable.b2);
            list.add(R.drawable.b3);
            list.add(R.drawable.b4);
    
    
            BannerAdapter adapter = new BannerAdapter(this, list);
            final RecyclerView recyclerView = findViewById(R.id.recycler);
            final SmoothLinearLayoutManager layoutManager = new SmoothLinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setHasFixedSize(true);
            recyclerView.setAdapter(adapter);
            recyclerView.scrollToPosition(list.size() * 10);
    
            PagerSnapHelper snapHelper = new PagerSnapHelper();
            snapHelper.attachToRecyclerView(recyclerView);
    
    
            final BannerIndicator bannerIndicator = findViewById(R.id.indicator);
            bannerIndicator.setNumber(list.size());
    
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                        int i = layoutManager.findFirstVisibleItemPosition() % list.size();
                        bannerIndicator.setPosition(i);
                    }
                }
            });
    
            ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
            scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    recyclerView.smoothScrollToPosition(layoutManager.findFirstVisibleItemPosition() + 1);
                }
            }, 2000, 2000, TimeUnit.MILLISECONDS);
    
        }
    }
    

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/bao-ZhangJiao/p/14268773.html
Copyright © 2011-2022 走看看