当前位置: 移动技术网 > IT编程>移动开发>Android > Android_RecyclerView实现上下滚动广告条实例(带图片)

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

建筑,黄金渔场121010,竞技者之极限酷跑

前言

公司新项目首页有个类似京东/淘宝滚动广告条,查了一下大概都是两种实现方式,一是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,很多细节没太考虑……有什么问题还望大佬们指出,不胜感激,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网