之前已经用过了ListView控件,虽然可以实现许多放入功能,但是其扩展性还是有一定缺陷的,比如所无法实现横向布局,为此,Android中提供了一个更强大的滚动控件——RecyclerView,它可以实现ListView的功能,同时还在ListView的基础上进行了优化。

RecyclerView基本使用

想要使用RecyclerView,首先我们应该在app的build.gradle中添加相关依赖:

dependencies {、、、implementation 'androidx.recyclerview:recyclerview:1.1.0'、、、
}

之后就可以直接使用RecyclerView控件了:

<!--由于RecyclerView并不是内置在SDK中,所以必须把完整的包路径写下来-->
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="wrap_content"/>

使用RecyclerView实现ListView相同的效果:

创建主活动CardRecyclerViewActivity,设置布局:

<?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"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view_card"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

编写子列表的布局:

<?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="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/card_image"android:layout_width="150dp"android:layout_height="150dp"android:scaleType="fitCenter"android:src="@mipmap/ic_launcher" /><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="6"android:layout_marginTop="3dp"android:layout_marginLeft="5dp"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="Name"android:id="@+id/card_name"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="Msg"android:id="@+id/card_msg" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="Info"android:id="@+id/card_info"/></LinearLayout></LinearLayout>

子列表样式:

创建一个Card类对应我们的列表项,用来封装数据:

public class Card {private String name;private int imageId;private String msg;private String info;public Card(String name, int imageId,String msg,String info) {this.name = name;this.imageId = imageId;this.msg=msg;this.info=info;}public String getName() {return name;}public int getImageId() {return imageId;}public String getMsg() {return msg;}public String getInfo() {return info;}
}

使用RecyclerView实现一个适配器,新建CardAdapter类,让这个类继承RecyclerView.Adapter,并将泛型置定位CardAdapter.ViewHolder。其中ViewHolder我们定义为内部类。

继承RecyclerView.Adapter需要实现的三个方法:

  • onCreateViewHolder(ViewGroup parent, int viewType):创建ViewHolder实例,在这个方法中可以将列表布局加载进来,之后创建一个ViewHolder实例,并把加载出来的布局传入到构造函数中,最后将ViewHolder实例返回。
  • onBindViewHolder(ViewHolder holder, int position):用于对RecyclerView子项进行赋值,会在每个子项被滚动到屏幕内时执行,我们可以通过position获取当前列表项对应的实例,然偶进行操作。
  • getItemCount():表示RecyclerView中有多少个子项,返回数据源的长度
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder>{private Context context;private List<Card> mCardList;public CardAdapter(Context context,List<Card> cardList) {this.context=context;mCardList = cardList;}@Overridepublic CardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);final ViewHolder holder = new ViewHolder(view);holder.cardView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int position = holder.getAdapterPosition();Card card = mCardList.get(position);Toast.makeText(v.getContext(),   card.getName()+": 奥里给", Toast.LENGTH_SHORT).show();}});holder.cardImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int position = holder.getAdapterPosition();final Card card = mCardList.get(position);AlertDialog.Builder builder=new AlertDialog.Builder(context);builder.setIcon(card.getImageId());builder.setTitle(card.getName());builder.setMessage("要拉我上船吗?");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(context,card.getName()+"加入了海贼船", Toast.LENGTH_SHORT).show();}});builder.setNegativeButton("取消", null);builder.create();builder.show();}});return holder;}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {Card card = mCardList.get(position);holder.cardImage.setImageResource(card.getImageId());holder.cardName.setText(card.getName());holder.cardMsg.setText(card.getMsg());holder.cardInfo.setText(card.getInfo());}@Overridepublic int getItemCount() {return mCardList.size();}static class ViewHolder extends RecyclerView.ViewHolder {View cardView;ImageView cardImage;TextView cardName;TextView cardMsg;TextView cardInfo;public ViewHolder(View view) {super(view);cardView = view;cardImage = (ImageView) view.findViewById(R.id.card_image);cardName = (TextView) view.findViewById(R.id.card_name);cardMsg=(TextView) view.findViewById(R.id.card_msg);cardInfo=(TextView) view.findViewById(R.id.card_info);}}
}

适配器准备好就可以编写主界面了:

public class CardRecyclerViewActivity extends AppCompatActivity {private List<Card> cardList = new ArrayList<Card>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_card_recycler_view);initCards();RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_card);LinearLayoutManager layoutManager=new LinearLayoutManager(this);//设置布局管理器recyclerView.setLayoutManager(layoutManager);//        StaggeredGridLayoutManager layoutManager = new
//        StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
//        recyclerView.setLayoutManager(layoutManager);//添加分割线recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));CardAdapter adapter = new CardAdapter(CardRecyclerViewActivity.this,cardList);//设置adapterrecyclerView.setAdapter(adapter);}private void initCards() {List<Card> list = new ArrayList<Card>();list.add(new Card("路飞", R.mipmap.lufei,"【船长】蒙奇·D·路飞(蒙奇·D·路飞 )","1500000000¥"));list.add(new Card("索隆", R.mipmap.suolong,"【剑士】罗罗诺亚·索隆","320000000¥"));list.add(new Card("乌索普", R.mipmap.wusuopu,"【狙击手】乌索普","200000000¥"));list.add(new Card("娜美", R.mipmap.namei,"【航海士】娜美","66000000¥"));list.add(new Card("山治", R.mipmap.shanzhi,"【厨师】香吉士","330000000¥"));list.add(new Card("乔巴", R.mipmap.qiaoba,"【船医】托尼托尼·乔巴","100¥"));list.add(new Card("罗宾", R.mipmap.luobin,"【考古学家】妮可·罗宾 ","130000000¥"));list.add(new Card("弗兰奇", R.mipmap.fulanqi,"【船匠】弗兰奇","94000000¥"));list.add(new Card("布鲁克", R.mipmap.buluke,"【音乐家】布鲁克","83000000¥"));list.add(new Card("香克斯", R.mipmap.xiangkesi,"【四皇】香克斯","4000000000¥"));for(int i=0;i<60;i++){cardList.add(list.get((int)(Math.random()*10)));}}}

运行结果:

实现不同样式的布局

修改子列表项的布局:card_item.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="wrap_content"android:orientation="vertical"><RelativeLayoutandroid:layout_width="150dp"android:layout_height="150dp"><ImageViewandroid:id="@+id/card_image"android:layout_width="150dp"android:layout_height="150dp"android:scaleType="fitCenter"android:src="@mipmap/ic_launcher" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Name"android:id="@+id/card_name"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="Info"android:id="@+id/card_info"/></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:layout_marginLeft="5dp"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:textSize="15dp"android:text="Msg"android:id="@+id/card_msg" /></LinearLayout></LinearLayout>

修改主活动的代码:

//LinearLayoutManager layoutManager=new LinearLayoutManager(this);
//recyclerView.setLayoutManager(layoutManager);//横向的效果
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);//网格布局
GridLayoutManager gridLayoutManager = new GridLayoutManager( this,3);
recyclerView.setLayoutManager(gridLayoutManager);//流式布局
StaggeredGridLayoutManager layoutManager = new
StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);

横向布局:

网格布局:

流式布局:

Android快速入门之滚动控件RecyclerView相关推荐

  1. Android 第十八课 强大的滚动控件 RecyclerView

    步骤: 一.添加依赖库 compile'com.android.support:recyclerview-v7:26.1.0' 二.在activity_mian.xml中,添加RecyclerView ...

  2. android横向滑动控件,Android学习——HorizontalScollview水平滚动控件

    HorizatalScollView控件只是支持水平滚动,而且它只能包含一个控件,通常是在标签中定义一个 标签并且在标签中android:orientation属性值设置为horization.然后在 ...

  3. Android 控件 RecyclerView 看这篇就够了

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  4. Android 控件 RecyclerView

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  5. Android之滚动控件Recycler

    Activity之滚动控件Recycler 基本用法 RecyclerView 不仅实现了和 ListView 同样的效果,而且还优化了 ListView 存在的各种不足. RecyclerView ...

  6. Android 循环滚动控件ViewFlipper,可实现跑马灯或轮播图效果

    ViewFlipper--Android循环滚动控件 1.效果如下: 2.实现方法 (1)创建进出动画 上下滚动动画 y_in.xml <?xml version="1.0" ...

  7. Android 控件 RecyclerView简单使用

    Android 控件 RecyclerView简单使用 1.导依赖库 implementation 'com.android.support:recyclerview-v7:27.1.1'implem ...

  8. Android滚动字幕公告字过长时横向滚动控件

    Android滚动字幕公告字过长时横向滚动控件 效果 Gradle 使用 属性 地址 效果 字体长度过大滚动字体,结束后上下滚动公告控件 Gradle repositories { maven { u ...

  9. 安卓进阶系列-05列表控件(RecyclerView)的使用

    RecyclerView的使用 前言 在之前的博客中我介绍了ListView如何使用,当然那部分博客由于没有考虑基础的问题,写的跨度太大,后面我会全部重构的. ListView是一个滑动列表控件,随着 ...

最新文章

  1. 树莓派400键盘计算机发布!全新的电路板布局,更快,更酷!
  2. 5.修改haproxy配置文件
  3. Apache Thrift快速入门教程
  4. 前端学习(3038):vue+element今日头条管理-使用请求拦截器
  5. 方向盘开极品飞车9很Hapyy
  6. FKGE:合格的知识图谱嵌入已经学会保护隐私啦!
  7. 如何开发一个基于Docker的Python 应用
  8. 纯CSS3浮雕质感的立体文字旋转动画
  9. gmsk的matlab仿真,MSKGMSK 导师传给我的关于MSK和GMSK的一些相关MATLAB仿真源码 - 下载 - 搜珍网...
  10. 计算机光盘无法格式化,c盘无法格式化怎么办 c盘无法格式化的解决方法
  11. 2023考研路上,恭祝诸君只争朝夕,不负韶华
  12. 街机游戏模拟器 mame for linux
  13. 中国长白山国际林海雪地马拉松节将于三月底举办
  14. 金融风控评分卡建模全流程!
  15. 写全武汉的火锅店..更新版 恩..欢迎补充 ^_^
  16. 计算机视觉方向好中的期刊有哪些?
  17. 交换机获取MAC地址
  18. 张静君的“商脉通”和企业博客
  19. 大数据公司挖掘数据价值的49个典型案例
  20. VB6编程:DirectX 2D图形学习日志20伽玛校正

热门文章

  1. 基于51单片机的密码锁多路测温+测距+语音播报
  2. CSH 入门基础 1 -- bash与 csh 差异 及csh常用语法介绍
  3. 单相电机数显调速器 STM8S003F3P6单片机控制,性能稳定,调速准确
  4. 「技术世界」SSD硬盘故障修复方法,轻松get新技能
  5. c语言邻接表,C++数据结构之实现邻接表
  6. 已解决:Window11问题 8080、8081、8082端口占用问题 Port 808X was already in use.
  7. Mybatis与Spring集成(易百教程)
  8. Spark - 利用 Spark SQL + MongoDB 对PandaTV主播进行等级分类
  9. Monaco Editor安装及使用
  10. 浅谈面孔识别相关研究