用recyclerview实现跑马灯文字无限轮播

1.主要是这个类实现滚动效果

public class AutoPollRecyclerView extends RecyclerView {

    private static final long TIME_AUTO_POLL = 100;
    AutoPollTask autoPollTask;
    private boolean running; //表示是否正在自动轮询
    private boolean canRun;//表示是否可以自动轮询

    public AutoPollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        autoPollTask = new AutoPollTask(this);
    }

    static class AutoPollTask implements Runnable {
        private final WeakReference<AutoPollRecyclerView> mReference;

        //使用弱引用持有外部类引用->防止内存泄漏
        public AutoPollTask(AutoPollRecyclerView reference) {
            this.mReference = new WeakReference<AutoPollRecyclerView>(reference);
        }

        @Override
        public void run() {
            AutoPollRecyclerView recyclerView = mReference.get();
            if (recyclerView != null && recyclerView.running && recyclerView.canRun) {
                recyclerView.scrollBy(2, 2);
                recyclerView.postDelayed(recyclerView.autoPollTask, TIME_AUTO_POLL);
            }
        }
    }

    //开启:如果正在运行,先停止->再开启
    public void start() {
        if (running)
            stop();
        canRun = true;
        running = true;
        postDelayed(autoPollTask, TIME_AUTO_POLL);
    }

    public void stop() {
        running = false;
        removeCallbacks(autoPollTask);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (running)
                    stop();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE:
                if (canRun)
                    start();
                break;
        }
        return super.onTouchEvent(e);
    }
}

2.适配器

public class AdapterItemAuto extends RecyclerView.Adapter<AdapterItemAuto.ViewHolder> {

    ArrayList<mBean> list;
    Context context;

    public AdapterItemAuto(Context context) {
        this.context = context;

    }

    //创建新View,被LayoutManager所调用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_main_adapter, viewGroup, false);//布局根据自己需要排版
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    //将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        mBean item = list.get(position % list.size());
        viewHolder.tvName.setText(item.getName());
    }

    //设置数据
    public void setItem(ArrayList<mBean> i) {
        if (i != null && i.size() > 0) {
            list = i;
            notifyDataSetChanged();
        }
    }

    //实现无限循环,默认设置最大值
    @Override
    public int getItemCount() {
//        return list == null ? 0 : list.size();
        return Integer.MAX_VALUE;
    }


    //自定义的ViewHolder,持有每个Item的的所有界面元素
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvName;

        ViewHolder(View view) {
            super(view);
            tvName = view.findViewById(R.id.tvName);

        }
    }
}

3.在布局里面引用

<com.XXX.AutoPollRecyclerView
    android:id="@+id/recycleList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

4.在activity里面调用

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recycleList.setLayoutManager(layoutManager);//
AdapterItemAuto mAdapter = new AdapterItemAuto(this);
recycle.setAdapter(mAdapter );
recycleList.start();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 RecyclerView 中的图片跑马灯,你可以使用 RecyclerView 的 LayoutManager 来实现这个效果。其中,LinearLayoutManager 可以用来实现水平滚动的效果。 1. 在 RecyclerView 的 Adapter 中添加一个 List<Drawable> 类型的数据源,用来存储要显示的图片。 2. 在 RecyclerView 的 ViewHolder 中添加一个 ImageView,用来显示图片。 3. 在 RecyclerView 的 Activity 或 Fragment 中设置 RecyclerView 的 LayoutManager 为 LinearLayoutManager,并设置其方向为水平方向。 4. 在 RecyclerView 的 Adapter 中重写 onBindViewHolder 方法,在其中设置 ViewHolder 的 ImageView 显示对应位置的图片,并设置 ImageView 的 ScaleType 为 FIT_XY,以充满整个 ImageView。 5. 在 RecyclerView 的 Activity 或 Fragment 中添加一个定时器,每隔一段时间就调用 RecyclerView 的 scrollToPosition 方法,将 RecyclerView 滚动到下一个位置,从而实现图片的跑马灯效果。 代码示例: Adapter 中的 onBindViewHolder 方法: ``` @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.imageView.setImageDrawable(drawables.get(position % drawables.size())); holder.imageView.setScaleType(ImageView.ScaleType.FIT_XY); } ``` Activity 或 Fragment 中的定时器: ``` private void startMarquee() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { int position = (linearLayoutManager.findLastVisibleItemPosition() + 1) % adapter.getItemCount(); recyclerView.smoothScrollToPosition(position); } }, 0, 3000); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值