当前位置:   article > 正文

【Android】用RecycleView实现可以横向滚动的ListView效果_recycleview多行多列横向滚动

recycleview多行多列横向滚动

终于闲下来了,总结一下RecycleView的使用。

一、概述

与常见的ListView和GridView一样,RecycleView也用来在有限的界面上展示大量的数据。它提供了一种插拔式的体验,高度的解耦,使用非常灵活,可以通过support-v7包进行导入。先看以下RecycleView可以实现的效果:

(单列上下滚动)

(多列上下滚动)

(多项横向滚动)

(瀑布流)

二、实现一个可以左右滑动的ListView的效果

1、RecycleView的布局

其实布局很简单,与ListView一样:

  1. <LinearLayout
  2. android:layout_marginTop="10dp"
  3. android:layout_marginLeft="10dp"
  4. android:layout_marginRight="10dp"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content">
  7. <android.support.v7.widget.RecyclerView
  8. android:id="@+id/recy_bringinto"
  9. android:layout_width="match_parent"
  10. android:layout_height="125dp">
  11. </android.support.v7.widget.RecyclerView>
  12. </LinearLayout>

2、RecycleView的使用设置

相比于ListView使用时,只需要设置一个adapter就OK了,RecycleView的使用则要相对复杂一点。通过设置它的LayoutManager,ItemDecoration , ItemAnimator可以实现各种那个各样的效果,详情参见

在这里我们主要用到了LayoutManager和ItemAnimator.

  1. recycleView=(RecyclerView)findViewById(R.id.recy_bringinto);
  2. recycleView.setHasFixedSize(true);//设置固定大小
  3. recycleView.setItemAnimator(new DefaultItemAnimator());//设置默认动画
  4. mLayoutManage=new LinearLayoutManager(this);
  5. mLayoutManage.setOrientation(OrientationHelper.HORIZONTAL);//设置滚动方向,横向滚动
  6. recycleView.setLayoutManager(mLayoutManage);
  7. 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,如果你用不到的话直接删除就好了。

详细代码:

  1. public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.MyViewHoler> implements View.OnClickListener {
  2. int ResourceID;
  3. Context mContext;
  4. ArrayList<BringInto> mData;
  5. private OnRecycleViewItemClickListener mOnItemClickListener;
  6. private ImageLoader imageLoader;
  7. public RecycleViewAdapter(Context context, int resourceID, ArrayList<BringInto> brings) {
  8. mContext=context;
  9. mData=brings;
  10. ResourceID=resourceID;
  11. }
  12. @Override
  13. public void onBindViewHolder(MyViewHoler holder, int position) {
  14. //相当于listview的adapter中的getview方法
  15. //负责将数据绑定到视图上
  16. if (imageLoader == null)
  17. imageLoader = ApplicationController.getInstance().getImageLoader();
  18. BringInto brin=mData.get(position);
  19. holder.tvToolName.setText(brin.getToolname());
  20. if(brin.getNotes().equals("人员进入"))
  21. {
  22. holder.ivPicIn.setBackgroundResource(R.drawable.user);
  23. }else {
  24. holder.ivPicIn.setImageUrl(brin.getPicIn(), imageLoader);
  25. }
  26. if(brin.iscorrect())
  27. {
  28. holder.ivCheck.setBackgroundResource(R.drawable.correct);
  29. }else{
  30. holder.ivCheck.setBackgroundResource(0);
  31. }
  32. holder.itemView.setTag(position);//将位置保存在tag中
  33. }
  34. @Override
  35. public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {
  36. //负责创建视图
  37. View view= LayoutInflater.from(mContext).inflate(ResourceID,null);
  38. view.setOnClickListener(this);
  39. return new MyViewHoler(view);
  40. }
  41. @Override
  42. public int getItemCount() {
  43. return mData.size();
  44. }
  45. @Override
  46. public void onClick(View v) {
  47. if (mOnItemClickListener!=null)
  48. {
  49. mOnItemClickListener.OnItemClick(v,(int)v.getTag());
  50. }
  51. }
  52. public void setOnItemClickListener(OnRecycleViewItemClickListener listener)
  53. {
  54. this.mOnItemClickListener=listener;
  55. }
  56. public static interface OnRecycleViewItemClickListener{
  57. void OnItemClick(View view,int position);
  58. }
  59. class MyViewHoler extends RecyclerView.ViewHolder
  60. {
  61. private final NetworkImageView ivPicIn;
  62. private final TextView tvToolName;
  63. private final ImageView ivCheck;
  64. public MyViewHoler(View itemView) {
  65. super(itemView);
  66. ivPicIn=(NetworkImageView)itemView.findViewById(R.id.iv_picIn);
  67. tvToolName=(TextView)itemView.findViewById(R.id.tv_toolname);
  68. ivCheck=(ImageView)itemView.findViewById(R.id.iv_check);
  69. }
  70. }
  71. }
单个的Item布局:

  1. <LinearLayout
  2. android:layout_marginRight="5dp"
  3. android:gravity="center"
  4. android:orientation="vertical"
  5. android:layout_width="wrap_content"
  6. android:layout_height="wrap_content">
  7. <com.android.volley.toolbox.NetworkImageView
  8. android:background="@drawable/default_picture"
  9. android:id="@+id/iv_picIn"
  10. android:layout_width="70dp"
  11. android:layout_height="70dp"
  12. android:text="缩略图"/>
  13. <TextView
  14. android:layout_marginTop="5dp"
  15. android:id="@+id/tv_toolname"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:textColor="#000000"
  19. android:textSize="15sp"
  20. android:text="名称"/>
  21. <ImageView
  22. android:id="@+id/iv_check"
  23. android:layout_width="25dp"
  24. android:layout_height="25dp"/>
  25. </LinearLayout>

4.如何让RecycleView响应我们的点击事件?

在上面你看到了我定义了一个公共方法:setOnItemClickListener,一旦要使用这个方法必须实现接口:OnRecycleViewItemClickListener,然后在onCreateViewHolder中View的点击事件中,就会自动执行接口中的OnItemClick方法,此方法有两个参数,一个是当前点击的View,另一个是View所在的位置。

5.将自定义的adapter绑定到RecycleView上

  1. recycleView.setAdapter(adapter);
  2. //recycleview的点击事件
  3. adapter.setOnItemClickListener(new RecycleViewAdapter.OnRecycleViewItemClickListener() {
  4. @Override
  5. public void OnItemClick(View view, int position) {
  6. //ShowDetail(listBrings.get(position),position);
  7. }
  8. });
是不是感觉与ListView的click有点不一样?我们是在adapter中进行点击事件绑定的。不管怎样,你还是拿到的点击后的View和Position。





声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/174682
推荐阅读
相关标签
  

闽ICP备14008679号