【Android】用RecycleView实现可以横向滚动的ListView效果
2017-02-21 11:08
681 查看
终于闲下来了,总结一下RecycleView的使用。
(单列上下滚动)
(多列上下滚动)
(多项横向滚动)
(瀑布流)
在这里我们主要用到了LayoutManager和ItemAnimator.
这里我们定义了一个内部类MyViewHolder继承于系统的RecyclerView.ViewHolder,然后RecycleViewAdapter继承RecycleView.Adapter。因为系统没有给我们的RecycleView控件实现OnClick方法,所以这里我让自定义的Adapter实现了View的OnClickListener接口,方便我们点击一个Item的时候可以做出响应。
熟悉ListView的人都知道,它是通过ViewHolder来提高性能的。onCreateViewHolder负责创建视图,解析单个Item的页面布局,并传入到MyViewHolder类中,进行findviewbyId。当滑动或者展示到手机屏幕上的时候通过onBindViewHolder方法将应该要显示的数据展示的屏幕上,在这个方法中因为用到了Volley,所以有个imageLoader,如果你用不到的话直接删除就好了。
详细代码:
一、概述
与常见的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 实现横向标题栏滚动效果(HorizontalScrollView + GridView + Viewpager + 自定义适配器)
- Android 实现ListView不可滚动效果
- Android 实现ListView不可滚动效果
- Android横向ListView可以滚动
- Android 实现ListView 3D效果 - 2 - 弹性滚动,Fling
- Android使用GridView实现横向滚动效果
- Android PinnedSectionListView实现滚动标题置顶/联系人列表效果
- Android textview和listview实现水平自动滚动的走马灯效果
- Android RecyclerView 实现横向滚动效果
- Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法
- Android通过实现GridView的横向滚动实现仿京东秒杀效果
- Android程序开发之ListView实现横向滚动(带表头与固定列)
- android开发(14) 可以横向滚动的ListView(固定列头)
- Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果
- android开发(14) 可以横向滚动的ListView(固定列头)
- Android 实现ListView不可滚动效果
- ListView 实现像Android Market那样 分页加载 滚动加载
- 说说Android桌面(Launcher应用)背后的故事(六)——研究Launcher而实现的附属品(可以拖拽的ListView)
- 只用html就可以实现图像的左右滚动效果
- Android 通过伪3D变换可以基本实现coverflow的效果