Android 高级UI设计笔记07:RecyclerView 的使用(ListView的扩展)
2015-11-16 09:33
746 查看
1. 使用RecyclerView
在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表、应用列表、消息列表等等,但是从Android 一出生到现在并没有非常好用的列表控件,早期的 ListView 用法非常复杂,尤其是自定义列表,简直就是地狱,因为其中还涉及到很多效率优化的问题,新手很难写出高效率的基于列表应用,而且 ListView 只能垂直方向呈现内容,使用很不灵活,为了解决这个缺陷,Android 官方推出了 RecyclerView 控件,用来替代 ListView。
核心内容:
Android RecyclerView 的用法
Android RecyclerView 横向布局
Android RecyclerView 垂直布局
Android RecyclerView 表格布局
这里我们使用的Android Studio,首先新建Android工程之后,右击app,打开 “Open Module Setting” ,然后找到“Dependencies"选项,添加RecyclerView依赖库。接下来我们就可以使用RecyclerView。
(1)首先我们来到MainActivity里面,如下:
布署程序到模拟器上,如下:(可以上下滑动滚动)
(2)利用数组承载数据源:
布署程序到模拟器上,如下:
2. 使用资源文件自定义列表项:
(1)首先来到MainActivity,如下:
(2)此时MyAdapter,如下:
此处我们用到了一个实体数据类ItemData,如下:
自定义布局文件资源为list_cell.xml:
(3)程序布署到模拟器上,如下:
3. RecyclerView的布局样式
( 1 )RecyclerView的横向布局:
修改2上面代码,如下:
list_cell.xml
同时来到MainActivity,如下:
布署程序到模拟器上,如下:
(2)RecyclerView的垂直布局
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
(3)RecyclerView的表格布局:
rv.setLayoutManager(new GridLayoutManager(this,3));
在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表、应用列表、消息列表等等,但是从Android 一出生到现在并没有非常好用的列表控件,早期的 ListView 用法非常复杂,尤其是自定义列表,简直就是地狱,因为其中还涉及到很多效率优化的问题,新手很难写出高效率的基于列表应用,而且 ListView 只能垂直方向呈现内容,使用很不灵活,为了解决这个缺陷,Android 官方推出了 RecyclerView 控件,用来替代 ListView。
核心内容:
Android RecyclerView 的用法
Android RecyclerView 横向布局
Android RecyclerView 垂直布局
Android RecyclerView 表格布局
这里我们使用的Android Studio,首先新建Android工程之后,右击app,打开 “Open Module Setting” ,然后找到“Dependencies"选项,添加RecyclerView依赖库。接下来我们就可以使用RecyclerView。
(1)首先我们来到MainActivity里面,如下:
package com.example.hebao.learnrv; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rv = new RecyclerView(this); //先加载RecyclerView setContentView(rv); //然后动态设置RecyclerView rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(new RecyclerView.Adapter(){ class ViewHolder extends RecyclerView.ViewHolder { private TextView tv; public ViewHolder(TextView itemView) { super(itemView); tv = itemView; } public TextView getTv() { return tv; } } /** * 创建ViewHolder * @param viewGroup * @param i * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new ViewHolder(new TextView(viewGroup.getContext())); } /** * 对上面自己创建的ViewHolder携带数据进行处理 * @param viewHolder * @param i */ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { ViewHolder vh = (ViewHolder) viewHolder; vh.getTv().setText("Item "+i); } /** * * 获取RecyclerView的子对象数量 */ @Override public int getItemCount() { return 100; } } ); } }
布署程序到模拟器上,如下:(可以上下滑动滚动)
(2)利用数组承载数据源:
package com.example.hebao.learnrv; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rv = new RecyclerView(this); setContentView(rv); rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(new RecyclerView.Adapter(){ private String[] data = new String[] {"hello", "二胎时代","九阴真经"}; class ViewHolder extends RecyclerView.ViewHolder { private TextView tv; public ViewHolder(TextView itemView) { super(itemView); tv = itemView; } public TextView getTv() { return tv; } } /** * 创建ViewHolder * @param viewGroup * @param i * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new ViewHolder(new TextView(viewGroup.getContext())); } /** * 对上面自己创建的ViewHolder携带数据进行处理 * @param viewHolder * @param i */ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { ViewHolder vh = (ViewHolder) viewHolder; vh.getTv().setText(data[i]); } /** * * 获取RecyclerView的子对象数量 */ @Override public int getItemCount() { return data.length; } }); } }
布署程序到模拟器上,如下:
2. 使用资源文件自定义列表项:
(1)首先来到MainActivity,如下:
package com.example.hebao.learnrv; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; public class MainActivity extends AppCompatActivity { private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rv = new RecyclerView(this); setContentView(rv); rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(new MyAdapter()); } }
(2)此时MyAdapter,如下:
package com.example.hebao.learnrv; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by hebao on 11/16/15. */ class MyAdapter extends RecyclerView.Adapter { private ItemData[] data = new ItemData[] {new ItemData("东邪", "黄药师"), new ItemData("西狂","杨过")}; class ViewHolder extends RecyclerView.ViewHolder { private View root; private TextView tvTitle, tvContent; public ViewHolder(View root) { super(root); tvTitle = (TextView) root.findViewById(R.id.tvTitle); tvContent = (TextView) root.findViewById(R.id.tvContent); } public TextView getTvContent() { return tvContent; } public TextView getTvTitle() { return tvTitle; } } /** * 创建ViewHolder * * @param viewGroup * @param i * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_cell, null)); } /** * 对上面自己创建的ViewHolder携带数据进行处理 * * @param viewHolder * @param i */ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { ViewHolder vh = (ViewHolder) viewHolder; ItemData id = data[i]; vh.getTvTitle().setText(id.title); vh.getTvContent().setText(id.content); } /** * 获取RecyclerView的子对象数量 */ @Override public int getItemCount() { return data.length; } }
此处我们用到了一个实体数据类ItemData,如下:
package com.example.hebao.learnrv; /** * Created by hebao on 11/16/15. */ public class ItemData { public String title = "title"; public String content ="content"; public ItemData(String title, String content) { this.title = title; this.content = content; } }
自定义布局文件资源为list_cell.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/tvTitle" android:layout_gravity="center_horizontal" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/tvContent" android:layout_gravity="center_horizontal" /> </LinearLayout>
(3)程序布署到模拟器上,如下:
3. RecyclerView的布局样式
( 1 )RecyclerView的横向布局:
修改2上面代码,如下:
list_cell.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/tvTitle" android:layout_gravity="center_horizontal" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/tvContent" android:layout_gravity="center_horizontal" /> </LinearLayout>
同时来到MainActivity,如下:
package com.example.hebao.learnrv; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; public class MainActivity extends AppCompatActivity { private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rv = new RecyclerView(this); setContentView(rv); //设置RecyclerView为横向布局 rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)); rv.setAdapter(new MyAdapter()); } }
布署程序到模拟器上,如下:
(2)RecyclerView的垂直布局
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
(3)RecyclerView的表格布局:
rv.setLayoutManager(new GridLayoutManager(this,3));
相关文章推荐
- CYC-UIViewController的生命周期及iOS程序执行顺序
- (java)Implement Queue using Stacks
- String,StringBuffer与StringBuilder的区别??
- Android UI之代码动态设置ImageView的宽度和高度
- UITableViewEdit
- break 与 continue的区别
- UITableView的一些常用方法
- NGUI -- UICamera
- 读《The Building a head thing Business When about there Are No》《创业维艰》
- LintCode "Longest Increasing Continuous subsequence II" !!
- IOS之UI--小实例项目--综合使用
- Educational Codeforces Round 1 B. Queries on a String(字符串简单操作)
- android基础--Handler,Loop,MessageQueue
- KVO(key value observer)浅解及实例
- Easyui--datagrid 的使用 (弹出框的使用)
- apue学习第一课,环境安装
- create unique string in batch
- UIImageview
- UIView之【UIViewContentMode】
- UITextField leftView 光标的边距 监听return键 字符长度的限制 以及其他的常用方法