想必大家对列表的表现形式曾经不再生疏。手机上有联系人列表,文件列表,短信列表等等。 本文讲述的是在 Android 开发中用 RecyclerView 来实现列表成果。
应用步骤
引入RecyclerView
在 app 的 build.gradle 文件中增加援用。咱们应用的是 androidx 包。
gradle:
dependencies { // ... implementation 'androidx.recyclerview:recyclerview:1.1.0'}
数据筹备
先确定一下要显示什么样的数据。是用户信息,联系人,或是文件。这里以字符为例。 写代码前,咱们先考虑一下需要,就是要如何显示,怎么显示数据。日常工作中,个别会有 UI 效果图。而本文中的美术设计就由咱们本人施展了。
比方显示 a
和 97
。
ViewHolder 与 layout
当初要显示的数据曾经确定了。来设计UI体现。layout与 ViewHolder 严密相干。在设计 Adapter 类前,先写 ViewHolder 类会比拟好。
新建定义 item(列表子项)的布局文件item_letter.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="match_parent" android:orientation="horizontal"> <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" /></LinearLayout>
这里应用外部类,把 ViewHolder 类写在 Activity 类外面。
创立VH类
private class VH extends RecyclerView.ViewHolder { TextView tv1; TextView tv2; public VH(@NonNull View itemView) { super(itemView); tv1 = itemView.findViewById(R.id.tv1); tv2 = itemView.findViewById(R.id.tv2); }}
从下面能够看出,ViewHolder 和 item 的 layout 是严密相干的。 layout 外面的 id 写的比较简单。理论我的项目中能够给一些更有意义的 id 命名。
在 activity 的 layout 文件中,增加RecyclerView。
layout 中增加 RecyclerView
<androidx.recyclerview.widget.RecyclerView android:id="@+id/re_view" android:layout_width="match_parent" android:layout_height="wrap_content" />
设计 Adapter
设计一个适配器继承自 RecyclerView.Adapter<VH>
。
这里的VH
是咱们下面写好的 ViewHolder。
LetterAdapter
中持有它本人的数据列表。须要实现3个办法。
onCreateViewHolder
办法,要求返回VH对象。- 这里就是创立VH对象并返回。而VH结构器要求传入一个View,咱们利用
LayoutInflater
创立一个view给它。当然,创立的依据就是后面设计好的item_letter
。
- 这里就是创立VH对象并返回。而VH结构器要求传入一个View,咱们利用
onBindViewHolder
是把数据交给对应的VH来显示。getItemCount
办法要求返回数据的数量。
LetterAdapter:
private class LetterAdapter extends RecyclerView.Adapter<VH> { private List<Character> dataList; public LetterAdapter(List<Character> dataList) { this.dataList = dataList; } @NonNull @Override public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_letter, parent, false)); } @Override public void onBindViewHolder(@NonNull VH holder, int position) { Character c = dataList.get(position); holder.tv1.setText(c.toString()); holder.tv2.setText(String.valueOf(Integer.valueOf(c))); } @Override public int getItemCount() { return dataList.size(); }}
粗枝大叶的时候,可能会遗记初始化 adapter 里的 dataList。会报一个null pointer
异样。
设置 RecyclerView
在 Activity 的 onCreate 办法里进行了初始化。
RecyclerView须要2项设置,适配器与LayoutManager。适配器就是咱们下面定的那个。 LayoutManager这里用LinearLayoutManager
,指定为垂直方向,这样咱们会失去一个高低滑动的列表。
应用 LinearLayoutManager
List<Character> characterList = new ArrayList<>();for (char c = 'a'; c <= 'z'; c++) { characterList.add(c);}mLetterAdapter = new LetterAdapter(characterList);RecyclerView letterReView = findViewById(R.id.re_view);letterReView.setAdapter(mLetterAdapter);letterReView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));` </pre></details>
察看运行后果
运行到手机或者模拟器上,关上这个activity。有的敌人就发现,为啥屏幕里一个子项item就占满了整个屏幕?
因为咱们后面设置的item占满屏幕。回到item_letter.xml
,看一下根layout的设置。 把layout_height="match_parent"
里的设置改为wrap_content
。 从新编译运行一下再看看后果。
咱们也能够给根 layout 设置固定的高度。具体视美术设计和需要而定。
Android零根底入门教程视频参考