示例,用RecyclerView的item做出一个列表。

Android教程2020 - 系列总览

这里我们做出一个具体的例子。尽量做好看一点。

这个示例会分为以下几个步骤:

  • 确定数据。这里用的是模拟数据。
  • 设计UI和表现形式。
  • 编写layout与适配器。

模拟数据

先模拟一个数据。新建一个类DataTest,它有4个属性。

public class DataTest {
private String timezone;
private int number;
private int personCount;
private int count; public DataTest(String timezone, int number, int personCount, int count) {
this.timezone = timezone;
this.number = number;
this.personCount = personCount;
this.count = count;
}
// getter setter...
}

设计item的布局

设计UI,在一行里显示4个属性值。item用的是item_recy2.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="wrap_content"
android:orientation="horizontal"> <TextView
android:id="@+id/tv1"
style="@style/RePage2Header"
android:layout_marginEnd="@dimen/re_2_half_gap" /> <TextView
android:id="@+id/tv2"
style="@style/RePage2Header"
android:layout_marginStart="@dimen/re_2_half_gap"
android:layout_marginEnd="@dimen/re_2_half_gap" /> <TextView
android:id="@+id/tv3"
style="@style/RePage2Header"
android:layout_marginStart="@dimen/re_2_half_gap"
android:layout_marginEnd="@dimen/re_2_half_gap" /> <TextView
android:id="@+id/tv4"
style="@style/RePage2Header"
android:layout_marginStart="@dimen/re_2_half_gap" /> </LinearLayout>

准备颜色,尺寸等资源

相关的style和颜色,尺寸配置文件,在res/values目录下。

style文件style.xml

    <style name="RePage2Header">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">40dp</item>
<item name="android:layout_weight">2</item>
<item name="android:textColor">#ffffff</item>
<item name="android:gravity">center</item>
<item name="android:background">@color/rePage2Item</item>
</style>

我们给layout里的每个TextView都设置了layout_width为0dp。是为了使用layout_weight属性。

让它们4个TextView按比例分割父View的宽度。

颜色配置文件color.xml,添加如下颜色设置。

    <color name="rePage2Item">#082941</color>

尺寸配置dimens.xml

    <dimen name="re_2_gap">4dp</dimen>
<dimen name="re_2_half_gap">2dp</dimen>

设计ViewHolder

资源文件和layout准备妥当,开始写对应的viewHolder。这里也是把VH类和Adapter类放在activity类里面。

    private class VH extends RecyclerView.ViewHolder {
TextView tv1;
TextView tv2;
TextView tv3;
TextView tv4; public VH(@NonNull View itemView) {
super(itemView);
tv1 = itemView.findViewById(R.id.tv1);
tv2 = itemView.findViewById(R.id.tv2);
tv3 = itemView.findViewById(R.id.tv3);
tv4 = itemView.findViewById(R.id.tv4);
}
}

设计Adapter类

适配器Adapter类。

    private class Adapter extends RecyclerView.Adapter<VH> {

        private List<DataTest> dataList = new ArrayList<>();

        public Adapter() {
} public void setDataList(List<DataTest> dataList) {
this.dataList = dataList;
notifyDataSetChanged();
} @NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recy2, parent, false));
} @Override
public void onBindViewHolder(@NonNull VH holder, int position) {
DataTest dataTest = dataList.get(position);
holder.tv1.setText(dataTest.getTimezone());
holder.tv2.setText(String.valueOf(dataTest.getNumber()));
holder.tv3.setText(String.valueOf(dataTest.getPersonCount()));
holder.tv4.setText(String.valueOf(dataTest.getCount()));
} @Override
public int getItemCount() {
return dataList.size();
}
}

配置RecyclerView

设置recyclerview。

    private Adapter mAdapter = new Adapter();

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_recy_2);
RecyclerView recyclerView = findViewById(R.id.re_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
recyclerView.setAdapter(mAdapter);
mAdapter.setDataList(genDataTestList());
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.top = getResources().getDimensionPixelOffset(R.dimen.re_2_gap);
}
});
} // 生成模拟数据
private List<DataTest> genDataTestList() {
List<DataTest> list = new ArrayList<>();
for (int i = 1; i <= 60; i++) {
DataTest d = new DataTest("时区" + i, i, i, i);
list.add(d);
}
return list;
}

在onCreate方法中配置recyclerView。

recyclerView.addItemDecoration方法是给item设置间隔样式。

getItemOffsets可以设置子项的间距。这里给子项底部一个间距值。具体数值设置在dimen中。

genDataTestList()是生成模拟的数据。

运行效果

运行起来即可看到效果。

使用include修改layout

看到效果图,有的朋友问:表头和item的结构是一样的,可以复用吗?

其实是可以的。我们可以在layout中使用include标签,把另一个layout文件“包含”进来。

复制act_recy_2.xml粘贴得到act_recy_2_include.xml,把原来的表头的LinearLayout改成include。

<include layout="@layout/item_recy2" />

给include设定layout,即我们定义的item的布局item_recy2

当我们想添加个margin-top的时候,比如这样

    <include
android:layout_marginTop="4dp"
layout="@layout/item_recy2" />

as会弹出警告:

Layout parameter layout_marginTop ignored unless both layout_width and layout_height are also specified on tag

也就是在include标签中,如果要设置其他属性,需要先设置layout_width和layout_height。

修改一下,再加个id,变成这样。

    <include
android:id="@+id/header"
layout="@layout/item_recy2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp" />

让Activity使用这个layout。修改一下RecyclerViewDemo2Act

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_recy_2_include);
initHeader();
// 配置RecyclerView的部分
} private void initHeader() {
View header = findViewById(R.id.header);
TextView tv1 = header.findViewById(R.id.tv1);
tv1.setText("时区");
TextView tv2 = header.findViewById(R.id.tv2);
tv2.setText("序号");
TextView tv3 = header.findViewById(R.id.tv3);
tv3.setText("人员");
TextView tv4 = header.findViewById(R.id.tv4);
tv4.setText("数量");
}

我们添加了一个方法initHeader()。里面先把header找到,通过header找到它的子view,也就是那4个TextView。

分别设置文字即可。

运行看看效果,是不是和前面的一样。

工程放这里: https://github.com/AnRFDev/Tutorial2020

相关阅读

RecyclerView - 使用入门

RecyclerView点击事件 - 如何设置点击事件

RecyclerView示例 - 实际使用

RecyclerView获取滑动距离

RecyclerView显示多种item

Android教程2020 - RecyclerView实际使用的更多相关文章

  1. Android教程2020 - RecyclerView使用入门

    本文介绍RecyclerView的使用入门.这里给出一种比较常见的使用方式. Android教程2020 - 系列总览 本文链接 想必读者朋友对列表的表现形式已经不再陌生.手机上有联系人列表,文件列表 ...

  2. Android教程2020 - RecyclerView响应点击

    本文介绍RecyclerView设置点击的方法.这里给出比较常见的使用方式. Android教程2020 - 系列总览 本文链接 前面我们已经知道如何用RecyclerView显示一列数据. 用户点击 ...

  3. Android教程2020 - RecyclerView显示多种item

    Android教程2020 - 系列总览 本文链接 前面我们已经用RecyclerView显示一些数据.也知道如何获取滑动的距离. 前面我们的列表中显示的都是同类数据.如果要在一个列表中显示不同类别的 ...

  4. Android教程2020 - RecyclerView获取滑动距离

    获取RecyclerView滑动的距离. Android教程2020 - 系列总览 本文链接 前面我们已经用RecyclerView显示一些数据. 本文演示如何获取RecyclerView的滑动距离. ...

  5. Xamarin Android教程如何使用Xamarin开发Android应用

    Xamarin Android教程如何使用Xamarin开发Android应用 在了解了Xamarin和Andriod系统之后,下面我们需要了解一下如何使用这些工具和系统来开发我们的应用程序. And ...

  6. Xamarin Android教程Android基本知识版本介绍与系统介绍

    Xamarin Android教程Android基本知识版本介绍与系统介绍 Xamarin Android教程Android基本知识版本介绍与系统介绍,开发Andriod有时候不像iOS一样轻松,因为 ...

  7. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  8. Android学习之RecyclerView

    RecyclerView是android-support-v7-21版本号中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本号,更加先进和灵活. 开发环境 - ...

  9. android开发学习 ------- RecyclerView多类型实例

    实现RecyclerView多类型的实例:效果如下图所示 public class CarFragment extends Fragment{ private View view; private R ...

随机推荐

  1. vs指定QT的工作目录(依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库)good

    当一个工程依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库.解决方法: 项目->属性->调试: 工作目录:指定程序运行时的目录 环境:指定程序运行时的环境变量 我们可以在环境变 ...

  2. 第二阶段:4.商业需求文档MRD:2.PRD-功能详细说明

    功能详细说明 功能一般分两类:1.通用性功能(导航,菜单项) 通过PRD让各个部门清楚的了解产品的各项功能构成.

  3. appium工作流程解析

    为什么选择appium ​ app自带测试框架,为什么要选择appium这个测试框架呢? Ios9.3以前使用的是UIAutomation,Ios9.3以后使用XCUITest.如果只使用Apple的 ...

  4. 20191121-3 Final阶段贡献分配规则

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/10063 ”组长”组final阶段贡献分分配规则 组里五位成员分别有入团队 ...

  5. 洛谷$P1155$ 双栈排序 贪心+二分图匹配

    正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...

  6. 10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   ...

  7. [gitHub实践] 实践记录

    [gitHub实践] 实践记录 版权2019.4.19更新 Q1:本地仓库和远程仓库连接提示输入用户名密码 本地仓库和远程仓库连接有两种方式 本地初始化建立一个仓库,远程也建立了一个仓库 本地建立仓库 ...

  8. 获取出口ip or api获取请求者ip

    艾玛,这两天为了整这个ip 真的可谓无所不用其极. 在网上查阅了各种资料,其实我想实现的功能很简单 就像百度 直接看到自己的出口ip 奈何查了许多资料,都没有适合的解决办法. 灵机一动,我是不是可以访 ...

  9. owa部署

    新建一台win server 2012(注意如果是2008要补丁) 配置静态ip DNS指向ad域的ip 测试: ping 下ad域的域名,是通的继续 把本机加入到ad域 重启下 用admin登陆: ...

  10. Java解析文件内容

    本文主要实现对.chk文件的解析,将其内容读出来,存入到一个Map中,文件内容实例为: A0500220140828.CHK A05002 |34622511 |373532879 |3 识别分隔符| ...