RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析。
先上效果图:

原理图:
这是RecycleView的工作原理:
1.LayoutManager用来处理RecycleView的“列表”样式,Support包默认包含了:LinearLayoutManager 横向或纵向的滚动列表、
GridLayoutManager 网格列表、StaggeredGridLayoutManager 交错的网格列表。
2.Adapter负责处理RecycleView的数据和样式
3.在传统的ListView中有一种常见的写法是使用ViewHolder来缓存数据集,在新版的RecycleView内置了ViewHolder这一模块,所以在Adapter内部新建内部类ViewHolder。
4.RecycleView 和listView的一个区别就是本身不处理点击事件,点击事件应该绑在ViewHolder里面,可以直接写也可以通过接口绑在Adapter里面来实现。
首先添加数据集:
package com.lfk.drawapictiure.Info; /**
* Created by liufengkai on 15/9/13.
*/
public class MenuInfo {
private String paint_name;
private String paint_time;
private String paint_root;
private String paint_img_root; public MenuInfo(String paint_name, String paint_time,
String paint_root, String paint_img_root) {
this.paint_name = paint_name;
this.paint_time = paint_time;
this.paint_root = paint_root;
this.paint_img_root = paint_img_root;
} public String getPaint_name() {
return paint_name;
} public String getPaint_time() {
return paint_time;
} public String getPaint_root() {
return paint_root;
} public String getPaint_img_root() {
return paint_img_root;
}
}
实现继承自RecycleView的Adapter中间要包裹自己实现的ViewHolder,onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值,
实现点击的接口,设置接口并且绑在ViewHolder的itemView里面即根视图中。
public class MainLayoutAdapter extends RecyclerView.Adapter<MainLayoutAdapter.MainViewHolder> {
private LayoutInflater inflater;
private ArrayList<MenuInfo> userList;
private Context context;
private MainItemClickListener itemClickListener;
public MainLayoutAdapter(ArrayList<MenuInfo> userList, Context context) {
this.userList = userList;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
public void setItemClickListener(MainItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
//onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值
@Override
public MainLayoutAdapter.MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View wrapper = inflater.inflate(R.layout.draw_item, parent, false);
return new MainViewHolder(
wrapper,
(TextView)wrapper.findViewById(R.id.paint_name),
(TextView)wrapper.findViewById(R.id.paint_time),
(TextView)wrapper.findViewById(R.id.paint_root),
(ImageView)wrapper.findViewById(R.id.paint_img));
}
@Override
public void onBindViewHolder(MainViewHolder holder, int position) {
MenuInfo menuInfo = userList.get(position);
holder.paint_img.setImageURI(Uri.parse(menuInfo.getPaint_img_root()));
holder.paint_name.setText(menuInfo.getPaint_name());
holder.paint_time.setText(menuInfo.getPaint_time());
holder.paint_root.setText(menuInfo.getPaint_root());
}
@Override
public int getItemCount() {
return userList.size();
}
public class MainViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
private TextView paint_name;
private TextView paint_time;
private TextView paint_root;
private ImageView paint_img;
public MainViewHolder(View itemView, TextView paint_name,
TextView paint_time, TextView paint_root,
ImageView paint_img) {
super(itemView);
itemView.setOnClickListener(this);
this.paint_name = paint_name;
this.paint_time = paint_time;
this.paint_root = paint_root;
this.paint_img = paint_img;
}
@Override
public void onClick(View view) {
MenuInfo menuInfo = userList.get(getAdapterPosition());
itemClickListener.onItemClick(view,menuInfo.getPaint_name(),menuInfo.getPaint_root());
}
@Override
public boolean onLongClick(View view) {
return false;
}
}
}
Activity中的使用:
package com.lfk.drawapictiure.Fragment; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import com.lfk.drawapictiure.Adapter.MainLayoutAdapter;
import com.lfk.drawapictiure.Info.MenuInfo;
import com.lfk.drawapictiure.InterFace.MainItemClickListener;
import com.lfk.drawapictiure.MainActivity;
import com.lfk.drawapictiure.R; import java.util.ArrayList; public class PaintFragment extends android.support.v4.app.Fragment {
private RecyclerView mRecyclerView;
private MainLayoutAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private String path = Environment.getExternalStorageDirectory().getPath() + "/DrawAPicture"; public static PaintFragment newInstance() {
return new PaintFragment();
} public PaintFragment() {
// Required empty public constructor
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); } @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View wrapper = inflater.inflate(R.layout.fragment_paint, container, false);
mRecyclerView = (RecyclerView)wrapper.findViewById(R.id.paint_recycle_view);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager); //绑上列表管理器
ArrayList<MenuInfo> arrayList = new ArrayList<>();
arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
mAdapter = new MainLayoutAdapter(arrayList, getActivity());
// 设置点击事件
mAdapter.setItemClickListener(new MainItemClickListener() {
@Override
public void onItemClick(View view, String name, String path) {
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.setData(Uri.parse(path));
startActivity(intent);
}
});
//绑定数据集
mRecyclerView.setAdapter(mAdapter); return wrapper;
} }
其中的子布局使用了CardView:
我设置的东西只有:
card_view:cardCornerRadius="4dp" //设定圆角半径
card_view:cardElevation="8dp"//设定阴影
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:background="@drawable/list_item_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:
android:layout_margin="@dimen/card_margin">
<RelativeLayout
android:layout_marginTop="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:maxHeight="100dp"
android:layout_marginTop="8dp"
android:layout_below="@+id/line_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/paint_img"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/paint_name"
android:textColor="#000"
android:textSize="18sp"
android:text="项目名"
android:layout_alignParentRight="true"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/paint_time"
android:text="项目时间"
android:textColor="@color/black"
android:textSize="18sp"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:id="@+id/line_view"
android:background="@color/gray"
android:layout_below="@+id/paint_time"
android:layout_width="match_parent"
android:layout_height="1dp"/>
<TextView
android:id="@+id/paint_root"
android:visibility="invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout> </android.support.v7.widget.CardView>
这只是第一篇继续使用过程中发现新特性还会更新!
RecycleView + CardView 控件简析的更多相关文章
- Android RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
- Flutter样式和布局控件简析(二)
开始 继续接着分析Flutter相关的样式和布局控件,但是这次内容难度感觉比较高,怕有分析不到位的地方,所以这次仅仅当做一个参考,大家最好可以自己阅读一下代码,应该会有更深的体会. Sliver布局 ...
- 一个可以配置阴影方向和颜色的类 CardView 控件 SCardView
一.控件简述 今天给大家推荐一个控件 SCardView ,看名字就很容易才出来它其实就是一个 CardView .把它拿出来,是因为它解决了一些 CardView 无法实现的需求以及简化了 Card ...
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...
- Android5.0新控件CardView的介绍和使用
CardView也是5.0的新控件,这控件其实就是一个卡片啦,当然我们自己也完全可以定义这样一个卡片,从现在的微博等社App中可以看到各式各样的自定义卡片,所以这个控件意义不是很大.suppor ...
- [Android] Android 卡片式控件CardView的优雅使用
[Android] Android 卡片式控件CardView的优雅使用 CardView是在安卓5.0提出的卡片式控件 其具体用法如下: 1.在app/build.gradle 文件中添加 comp ...
- WinForm 自动完成控件实例代码简析
在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了. TextBox控件本身是提供了一个自动提示功能,只要用上这三个属性: AutoComple ...
- c#字符串加载wpf控件模板代码 - 简书
原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...
- WPF 动画:同为控件不同命 - 简书
原文:WPF 动画:同为控件不同命 - 简书 1. 及格与优秀 读大学的时候,有一门课的作业是用 PPT 展示. 但是我们很多同学都把 PPT 当做 Word 来用,就单纯地往里面堆文字. 大家都单纯 ...
随机推荐
- 用css计算选中的复选框有几个
上代码: <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>计数< ...
- Bootstrap左侧下拉三级菜单
在线实例 效果一 效果二 效果三 使用方法 <script src="/api/jq/BootstrapCaidan/js/metismenu.js"></scr ...
- 关于HTML面试题汇总之visibility
一.页面可见性(visibility) 主要提供两个属性,一个事件(都在document对象上):1. 属性: 1.1. hidden:获取或设置当前页面的可见性,boolean值: 1.2 ...
- 优秀的 HTML5 实战教程,提升你的综合开发能力
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- 【javascript激增的思考02】模块化与MVC
前言 之前我们遇到了这么一个项目,也就是我们昨天提到的,有很多的小窗口的,昨天说的太抽象了,今天我们再来理一理什么是小窗口(后面点说下),当时由于js有一点复杂,我自己也装B跟风用了一下传说中MVC! ...
- AngularJS1.3一些技巧
前言 框架选择.在上一篇文章评论中,有人说angular1.3是个过时的东西,建议使用angular2.其实这种说法很像拿jQuery1.x和jQuery2.x做比较,新的版本当然会有优化优势的地方, ...
- Httplistener Access Denied
HttpListener.Start() 会出现HttpListenerException, 显示拒绝访问 一般是因为有些计算机账户是没有权限创建 HttpListener服务, 但是可以注册一些规则 ...
- ECMAScript对文件夹图片幻灯片播放
代码如下: var curContext = null; var curWeb = null; var picListTitle = "PictureLib"; var folde ...
- GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?
GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样? 先了解一下 高德地图 采用: GCJ-02 (不可逆) 百度百科: http://baike.baidu.com/link?url ...
- Android打开相机和打开相册
打开相机 /** * 选择相机 */ private void showCamera() { // 跳转到系统照相机 Intent cameraIntent = new Intent(MediaSto ...