【Android】用RecycleView实现可以横向滚动的ListView效果
来源:互联网 发布:软件小品 编辑:程序博客网 时间:2024/05/01 14:17
终于闲下来了,总结一下RecycleView的使用。
一、概述
与常见的ListView和GridView一样,RecycleView也用来在有限的界面上展示大量的数据。它提供了一种插拔式的体验,高度的解耦,使用非常灵活,可以通过support-v7包进行导入。先看以下RecycleView可以实现的效果:
(单列上下滚动)
(多列上下滚动)
(多项横向滚动)
(瀑布流)
二、实现一个可以左右滑动的ListView的效果
1、RecycleView的布局
其实布局很简单,与ListView一样:
<LinearLayout android:layout_marginTop="10dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recy_bringinto" android:layout_width="match_parent" android:layout_height="125dp"> </android.support.v7.widget.RecyclerView> </LinearLayout>
2、RecycleView的使用设置
相比于ListView使用时,只需要设置一个adapter就OK了,RecycleView的使用则要相对复杂一点。通过设置它的LayoutManager,ItemDecoration , ItemAnimator可以实现各种那个各样的效果,详情参见。
在这里我们主要用到了LayoutManager和ItemAnimator.
recycleView=(RecyclerView)findViewById(R.id.recy_bringinto); recycleView.setHasFixedSize(true);//设置固定大小 recycleView.setItemAnimator(new DefaultItemAnimator());//设置默认动画 mLayoutManage=new LinearLayoutManager(this); mLayoutManage.setOrientation(OrientationHelper.HORIZONTAL);//设置滚动方向,横向滚动 recycleView.setLayoutManager(mLayoutManage); adapter=new RecycleViewAdapter(this,R.layout.recycleview_bringinto,listBrings);其中,setOrientation()方法设置其只能横向滚动。
3、自定义RecycleView使用的adapter
在上一步最后一行,你看到了我自己定义RecycleViewAdapter类,它接受三个参数,分别是上下文对象Context、单个Item的布局文件、要显示的数据。
这里我们定义了一个内部类MyViewHolder继承于系统的RecyclerView.ViewHolder,然后RecycleViewAdapter继承RecycleView.Adapter。因为系统没有给我们的RecycleView控件实现OnClick方法,所以这里我让自定义的Adapter实现了View的OnClickListener接口,方便我们点击一个Item的时候可以做出响应。
熟悉ListView的人都知道,它是通过ViewHolder来提高性能的。onCreateViewHolder负责创建视图,解析单个Item的页面布局,并传入到MyViewHolder类中,进行findviewbyId。当滑动或者展示到手机屏幕上的时候通过onBindViewHolder方法将应该要显示的数据展示的屏幕上,在这个方法中因为用到了Volley,所以有个imageLoader,如果你用不到的话直接删除就好了。
详细代码:
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.MyViewHoler> implements View.OnClickListener { int ResourceID; Context mContext; ArrayList<BringInto> mData; private OnRecycleViewItemClickListener mOnItemClickListener; private ImageLoader imageLoader; public RecycleViewAdapter(Context context, int resourceID, ArrayList<BringInto> brings) { mContext=context; mData=brings; ResourceID=resourceID; } @Override public void onBindViewHolder(MyViewHoler holder, int position) { //相当于listview的adapter中的getview方法 //负责将数据绑定到视图上 if (imageLoader == null) imageLoader = ApplicationController.getInstance().getImageLoader(); BringInto brin=mData.get(position); holder.tvToolName.setText(brin.getToolname()); if(brin.getNotes().equals("人员进入")) { holder.ivPicIn.setBackgroundResource(R.drawable.user); }else { holder.ivPicIn.setImageUrl(brin.getPicIn(), imageLoader); } if(brin.iscorrect()) { holder.ivCheck.setBackgroundResource(R.drawable.correct); }else{ holder.ivCheck.setBackgroundResource(0); } holder.itemView.setTag(position);//将位置保存在tag中 } @Override public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType) { //负责创建视图 View view= LayoutInflater.from(mContext).inflate(ResourceID,null); view.setOnClickListener(this); return new MyViewHoler(view); } @Override public int getItemCount() { return mData.size(); } @Override public void onClick(View v) { if (mOnItemClickListener!=null) { mOnItemClickListener.OnItemClick(v,(int)v.getTag()); } } public void setOnItemClickListener(OnRecycleViewItemClickListener listener) { this.mOnItemClickListener=listener; } public static interface OnRecycleViewItemClickListener{ void OnItemClick(View view,int position); } class MyViewHoler extends RecyclerView.ViewHolder { private final NetworkImageView ivPicIn; private final TextView tvToolName; private final ImageView ivCheck; public MyViewHoler(View itemView) { super(itemView); ivPicIn=(NetworkImageView)itemView.findViewById(R.id.iv_picIn); tvToolName=(TextView)itemView.findViewById(R.id.tv_toolname); ivCheck=(ImageView)itemView.findViewById(R.id.iv_check); } }}单个的Item布局:
<LinearLayout android:layout_marginRight="5dp" android:gravity="center" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <com.android.volley.toolbox.NetworkImageView android:background="@drawable/default_picture" android:id="@+id/iv_picIn" android:layout_width="70dp" android:layout_height="70dp" android:text="缩略图"/> <TextView android:layout_marginTop="5dp" android:id="@+id/tv_toolname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="15sp" android:text="名称"/> <ImageView android:id="@+id/iv_check" android:layout_width="25dp" android:layout_height="25dp"/> </LinearLayout>
4.如何让RecycleView响应我们的点击事件?
在上面你看到了我定义了一个公共方法:setOnItemClickListener,一旦要使用这个方法必须实现接口:OnRecycleViewItemClickListener,然后在onCreateViewHolder中View的点击事件中,就会自动执行接口中的OnItemClick方法,此方法有两个参数,一个是当前点击的View,另一个是View所在的位置。
5.将自定义的adapter绑定到RecycleView上
recycleView.setAdapter(adapter); //recycleview的点击事件 adapter.setOnItemClickListener(new RecycleViewAdapter.OnRecycleViewItemClickListener() { @Override public void OnItemClick(View view, int position) { //ShowDetail(listBrings.get(position),position); } });是不是感觉与ListView的click有点不一样?我们是在adapter中进行点击事件绑定的。不管怎样,你还是拿到的点击后的View和Position。
- 【Android】用RecycleView实现可以横向滚动的ListView效果
- Android横向ListView可以滚动
- android TV开发:使用RecycleView实现横向的Listview并响应点击事件
- android listview 横向滚动
- Android RecyclerView 实现横向滚动效果
- recycleView简单实现listview的效果
- TextView 横向滚动效果的实现
- 横向滚动的ListView
- android开发(14) 可以横向滚动的ListView(固定列头)
- RecyclerView 实现横向滚动效果
- RecyclerView 实现横向滚动效果
- android 图片横向滚动效果
- android 图片横向滚动效果
- android 图片横向滚动效果
- 横向ListView的自动滚动
- android 横向滚动文字的实现
- Android横向ListView实现
- Android横向ListView实现
- centos7.2+zabbix3.2+sedmail邮件告警
- magento 2.1.4 url出现版本号,怎样解决?
- 类继承中的一个知识点
- Codeforces 768C Jon Snow and his Favourite Number
- MongoDB replication (1)
- 【Android】用RecycleView实现可以横向滚动的ListView效果
- Navicat11全系列激活(注册机)
- Idea打包Jar文件
- Tomcat的简单认识
- 如何是linux服务器 下的tomcat能够支持中文文件名和中文路径
- MySQL分页查询
- 关于寻路算法的一些思考(1):A* 算法介绍
- MongoDB replication (2)
- 微型四旋翼飞行器的设计与制作