欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android_RecyclerView实现上下滚动广告条实例(带图片)

程序员文章站 2023-11-12 13:16:10
前言 公司新项目首页有个类似京东/淘宝滚动广告条,查了一下大概都是两种实现方式,一是textview,如果只有文字的话是可行的,但我们这个上面还有个小图片,所以pass;...

前言

公司新项目首页有个类似京东/淘宝滚动广告条,查了一下大概都是两种实现方式,一是textview,如果只有文字的话是可行的,但我们这个上面还有个小图片,所以pass;二是两个viewgroup,使用动画交替滚动,可以实现,就是显得很麻烦,于是偷懒的我就想着用recyclerview来解决这个小问题!

思路

这个滚动广告条高度通常是固定的,用一个固定高度的viewgroup来包裹一个recyclerview,recylerview的item布局设置一个minheight为viewgroup的高度,这样刚好能看到一个完整的item,然后使用recyclerview自带的方法 smoothscrollby()来滚动recyclerview;他需要两个参数,x轴的滚动距离和y轴的滚动距离,我们是上下滚动,所以x轴传入1就好啦!y轴距离传入你的item高度,然后使用handler写一个循环任务就可以实现一直滚动啦!

/**
   * animate a scroll by the given amount of pixels along either axis.
   *
   * @param dx pixels to scroll horizontally
   * @param dy pixels to scroll vertically
   */
  public void smoothscrollby(int dx, int dy) {
    smoothscrollby(dx, dy, null);
  }

遇到的问题

写好之后发现这个控件是不能够触摸滑动的,但是又需要点击事件。想了想如果在ontouchevent之类的方法中处理的话很麻烦,还不能保证完全禁止一点点都不能滑,所以就又想了个偷懒的办法。给recyclerview上加一层透明的蒙板,彻底禁用掉recyclerview的touch事件,给蒙板设置点击事件……下面是代码

布局:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="60dp"
       android:background="@color/colorwhite"
       android:orientation="horizontal">

  <textview
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginleft="18dp"
    android:gravity="center"
    android:text="养车\n宝典"
    android:textcolor="@color/colortitle"
    android:textsize="12sp"/>

  <view
    android:layout_width="0.5dp"
    android:layout_height="match_parent"
    android:layout_marginbottom="12dp"
    android:layout_marginleft="10dp"
    android:layout_margintop="12dp"
    android:background="@color/colortitle"/>

  <!--禁用了recyclerview的触摸事件,他的点击事件交由一个透明的蒙版来实现-->
  <relativelayout
    android:layout_marginleft="6dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.xinshiwi.mycar.view.autoscrollrecyclerview
      android:id="@+id/rv_home_maintain"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

    <view
      android:id="@+id/view_home_maintain"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@android:color/transparent"/>

  </relativelayout>

</linearlayout>

adapter:

public class maintaininfoadapter extends recyclerview.adapter<maintaininfoadapter.myviewholder> {

  list<string> list;
  public maintaininfoadapter(list<string> list) {
    this.list = list;
  }

  @override
  public myviewholder oncreateviewholder(viewgroup parent, int viewtype) {
    view view = layoutinflater.from(parent.getcontext()).inflate(r.layout.item_home_maintain, null);

    return new myviewholder(view);
  }

  @override
  public void onbindviewholder(myviewholder holder, int position) {
    holder.tv.settext(list.get(position % 4));
  }

  @override
  public int getitemcount() {
    return integer.max_value;
  }

  public static class myviewholder extends recyclerview.viewholder {

    public textview tv;

    public myviewholder(view itemview) {
      super(itemview);
      tv = (textview) itemview.findviewbyid(r.id.tv_maintain);
    }

  }
}

设置recyclerview:

/**
   * 滚动养车宝典
   */
  private void initmaintaindata() {
    mlist = new arraylist<>();
    mlist.add("如何做好队汽车的轮胎养护0");
    mlist.add("如何做好队汽车的轮胎养护1");
    mlist.add("如何做好队汽车的轮胎养护2");
    mlist.add("如何做好队汽车的轮胎养护3");
    mrvhomemaintain.setlayoutmanager(new linearlayoutmanager(mactivity));
    madapter = new maintaininfoadapter(mlist);
    mrvhomemaintain.setadapter(madapter);
    message msg = new message();
    msg.what = maintain_info;
    shandler.sendmessagedelayed(msg, 3000);
    //通过一个透明的蒙板来设置点击事件
    mviewhomemaintain.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        toast.maketext(mactivity, "pos % 4:" + (pos % 4), toast.length_short).show();
      }
    });
  }
//当前显示的item
private int pos = 0;
private handler shandler = new handler() {
    @override
    public void handlemessage(message msg) {
      super.handlemessage(msg);
      switch (msg.what) {
        case maintain_info:
          mrvhomemaintain.smoothscrollby(0, sizeutils.dp2px(60));
          pos++;
          message message = new message();
          message.what = maintain_info;
          shandler.removemessages(maintain_info);
          shandler.sendmessagedelayed(message, 3000);
          break;
      }
    }
  };

只是一个小demo,很多细节没太考虑……有什么问题还望大佬们指出,不胜感激,也希望大家多多支持。