简介:

本篇博客主要介绍的是如何使用RecyclerView实现图片水平方向自动循环(跑马灯效果)

效果图:

  

思路:

1.准备m张图片

1.使用Recyclerview实现,返回无数个(实际Interge.MAXVALUE)item,第n个item显示第n%m张图片

3.使用recyclerview.scrollBy  每个一段时间水平滚动一段距离

4.通过layoutManager.findFirstVisibleItemPosition()获取当前显示的第一个View是第几个item,上面的ImageView显示对应de图片

  

实现代码:

XML文件

1.activity布局文件activity_recy.xml

  

<?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="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="300dp"
android:layout_height="350dp"
android:layout_gravity="center_horizontal"
android:id="@+id/img"
android:src="@drawable/p5"
android:scaleType="fitXY"
/> <android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_marginTop="10dp"
android:id="@+id/recyclerview"
></android.support.v7.widget.RecyclerView> </LinearLayout>

2.适配器布局item_horizon.xml

  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="100dp"
android:layout_height="match_parent"
android:id="@+id/img"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:scaleType="fitXY"
/> </LinearLayout>

Activity

  

public class HorizontalActivity extends AppCompatActivity implements RecyAdapter.OnItemClickListener {
private String TAG="HorizontalActivity"; @BindView(R.id.img)
ImageView img;
@BindView(R.id.recyclerview)
RecyclerView recyclerview; private Integer[] mImgIds = {R.drawable.p1, R.drawable.p2, R.drawable.p3, R.drawable.p4, R.drawable.p5,
R.drawable.pic1, R.drawable.pic5, R.drawable.pic6};
private List<Integer> datas;
private RecyAdapter recyAdapter;
private Handler mHandler=new Handler();
private LinearLayoutManager layoutManager; private int oldItem=0; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recy);
ButterKnife.bind(this);
initData();
initRecy();
img.setImageResource(datas.get(0));
recyAdapter.setOnItemClickListener(this);
} Runnable scrollRunnable=new Runnable() {
@Override
public void run() {
recyclerview.scrollBy(3,0); // int firstItem = layoutManager.findFirstVisibleItemPosition();
int firstItem=layoutManager.findFirstVisibleItemPosition();
if(firstItem!=oldItem&&firstItem>0){
oldItem=firstItem;
img.setImageResource(datas.get(oldItem%datas.size()));
} Log.e(TAG, "run: firstItem:"+firstItem ); mHandler.postDelayed(scrollRunnable,10);
}
}; private void initRecy() {
recyAdapter=new RecyAdapter(this,datas); layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerview.setLayoutManager(layoutManager);
recyclerview.setAdapter(recyAdapter);
} private void initData() {
datas=new ArrayList<>();
for (int i = 0; i <mImgIds.length ; i++) {
datas.add(mImgIds[i]);
}
} @Override
protected void onResume() {
super.onResume();
mHandler.postDelayed(scrollRunnable,10);
} @Override
protected void onStop() {
super.onStop();
mHandler.removeCallbacks(scrollRunnable);
} @Override
public void onItemClick(View view, int tag) {
Toast.makeText(this,"第"+tag+"张图片被点击了",Toast.LENGTH_SHORT).show();
}
}

适配器RecyAdapter

public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.ViewHolder> implements View.OnClickListener {

    private Context context;
private List<Integer> datas;
private OnItemClickListener onItemClickListener; public RecyAdapter(Context context, List<Integer> datas) {
this.context = context;
this.datas = datas;
} @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_horizontal, parent, false);
ViewHolder vh=new ViewHolder(view);
view.setOnClickListener(this);
return vh;
} @Override
public void onBindViewHolder(ViewHolder holder, int position) {
int newPos=position%datas.size(); holder.img.setImageResource(datas.get(newPos)); holder.itemView.setTag(position); } @Override
public int getItemCount() {
return Integer.MAX_VALUE;
} @Override
public void onClick(View view) {
if(onItemClickListener!=null){
onItemClickListener.onItemClick(view, (Integer) view.getTag());
}
} class ViewHolder extends RecyclerView.ViewHolder {
ImageView img;
public ViewHolder(View itemView) {
super(itemView);
img=itemView.findViewById(R.id.img);
}
} public void setOnItemClickListener(OnItemClickListener listener){
this.onItemClickListener=listener; }
interface OnItemClickListener{
void onItemClick(View view,int tag);
} }
												

使用Recyclerview实现图片水平自动循环滚动的更多相关文章

  1. UIScrollView实现自动循环滚动广告

    实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...

  2. IOS实现自动循环滚动广告--ScrollView的优化和封装

    一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题, ...

  3. ListView的自动循环滚动显示

    最近项目里需要做评价内容的循环滚动显示,一开始想到的就是定时器.后来查了资料才知道ListView里面有个函数smoothScrollToPosition(position),瞬间觉得简单了很多.首先 ...

  4. IOS无限自动循环滚动banner(源码)

    本文转载至 http://blog.csdn.net/iunion/article/details/19080259  目前有很多APP都开始使用一些滚动banner,我自己也做了一个,部分算法没有深 ...

  5. UIScrollView现实自动循环滚动

    #import "RootViewController.h" #define width [UIScreen mainScreen].bounds.size.width #defi ...

  6. 自动循环滚动ScrollView

    // // SBCycleScrollView.h // SBCycleScrollView // // Created by luo.h on 15/7/12. // Copyright (c) 2 ...

  7. item上下自动循环滚动显示

    //li 上下滚动 (function($){ $.fn.extend({ Scroll:function(opt,callback){ //参数初始化 if(!opt) var opt={}; va ...

  8. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  9. [iOS] UICollectionView实现图片水平滚动

    最新更新: 简单封装了一下代码,参考新文章:UICollectionView实现图片水平滚动 先简单看一下效果: 新博客:http://wossoneri.github.io 准备数据 首先先加入一些 ...

随机推荐

  1. Nginx安装过程

    1. 首先 ./configure --prefix=/usr/common/nginx --with-http_stub_status_module 报如下错误: 2. 从报的错可以看出缺少pcre ...

  2. Studio 3T 如何使用 Query Builder 查询数据

    Studio 3T 是一款对 MongoDB 进行数据操作的可视化工具. 在 Studio 3T 中,我们可以借助 Query Builder 的 Drag & Drop 来构建查询条件. 具 ...

  3. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  4. java排序。。简单的冒泡排序

    总结:一种简单的交换顺序,从数左边开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,将较大值后移,每经过一轮排序后,值最大的元素将移到末尾, 此时记下该元素的位置,下一轮排序只需比较到此位置即 ...

  5. 权益保护-知识产权:知识产权(IP)百科

    ylbtech-权益保护-知识产权:知识产权(IP)百科 知识产权,也称其为“知识所属权”,指“权利人对其智力劳动所创作的成果和经营活动中的标记.信誉所依法享有的专有权利”,一般只在有限时间内有效.各 ...

  6. php中的move_uploaded_file

    1.定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 2.语法 move_uploaded_file(file,n ...

  7. Oracle日常性能问题查看

    1 判断回滚段竞争的sql --当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段) ratio from v$rollstat rs, v$rollname rn where rs.USN = ...

  8. Oracle数据库Where条件执行顺序

    由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHE ...

  9. javascript好文分享

    JavaScript精华 http://www.cnblogs.com/jesse2013/p/the-part-of-javascript-you-must-know.html JavaScript ...

  10. 定时器Quartz ClassNotFound org.springframework.scheduling.quartz.SchedulerFactoryBean

    转自:https://blog.csdn.net/truong/article/details/37508003 没有添加spring-context-support-3.2.4.RELEASE.ja ...