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里面来实现。

首先添加数据集:

 1 package com.lfk.drawapictiure.Info;
 2
 3 /**
 4  * Created by liufengkai on 15/9/13.
 5  */
 6 public class MenuInfo {
 7     private String paint_name;
 8     private String paint_time;
 9     private String paint_root;
10     private String paint_img_root;
11
12     public MenuInfo(String paint_name, String paint_time,
13                     String paint_root, String paint_img_root) {
14         this.paint_name = paint_name;
15         this.paint_time = paint_time;
16         this.paint_root = paint_root;
17         this.paint_img_root = paint_img_root;
18     }
19
20     public String getPaint_name() {
21         return paint_name;
22     }
23
24     public String getPaint_time() {
25         return paint_time;
26     }
27
28     public String getPaint_root() {
29         return paint_root;
30     }
31
32     public String getPaint_img_root() {
33         return paint_img_root;
34     }
35 }

实现继承自RecycleView的Adapter中间要包裹自己实现的ViewHolder,onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值,

实现点击的接口,设置接口并且绑在ViewHolder的itemView里面即根视图中。

 1 public class MainLayoutAdapter extends RecyclerView.Adapter<MainLayoutAdapter.MainViewHolder> {
 2     private LayoutInflater inflater;
 3     private ArrayList<MenuInfo> userList;
 4     private Context context;
 5     private MainItemClickListener itemClickListener;
 6
 7     public MainLayoutAdapter(ArrayList<MenuInfo> userList, Context context) {
 8         this.userList = userList;
 9         this.context = context;
10         this.inflater = LayoutInflater.from(context);
11     }
12
13     public void setItemClickListener(MainItemClickListener itemClickListener) {
14         this.itemClickListener = itemClickListener;
15     }
16   //onCreateviewHolder函数和onBindViewHolder实现了ListView里面getView的工作,分别为找到控件和控件赋值
17     @Override
18     public MainLayoutAdapter.MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
19         View wrapper = inflater.inflate(R.layout.draw_item, parent, false);
20         return new MainViewHolder(
21                 wrapper,
22                 (TextView)wrapper.findViewById(R.id.paint_name),
23                 (TextView)wrapper.findViewById(R.id.paint_time),
24                 (TextView)wrapper.findViewById(R.id.paint_root),
25                 (ImageView)wrapper.findViewById(R.id.paint_img));
26     }
27
28     @Override
29     public void onBindViewHolder(MainViewHolder holder, int position) {
30         MenuInfo menuInfo = userList.get(position);
31         holder.paint_img.setImageURI(Uri.parse(menuInfo.getPaint_img_root()));
32         holder.paint_name.setText(menuInfo.getPaint_name());
33         holder.paint_time.setText(menuInfo.getPaint_time());
34         holder.paint_root.setText(menuInfo.getPaint_root());
35     }
36
37
38     @Override
39     public int getItemCount() {
40         return userList.size();
41     }
42
43     public class MainViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
44         private TextView paint_name;
45         private TextView paint_time;
46         private TextView paint_root;
47         private ImageView paint_img;
48         public MainViewHolder(View itemView, TextView paint_name,
49                           TextView paint_time, TextView paint_root,
50                           ImageView paint_img) {
51             super(itemView);
52             itemView.setOnClickListener(this);
53             this.paint_name = paint_name;
54             this.paint_time = paint_time;
55             this.paint_root = paint_root;
56             this.paint_img = paint_img;
57         }
58
59         @Override
60         public void onClick(View view) {
61             MenuInfo menuInfo = userList.get(getAdapterPosition());
62             itemClickListener.onItemClick(view,menuInfo.getPaint_name(),menuInfo.getPaint_root());
63         }
64
65         @Override
66         public boolean onLongClick(View view) {
67             return false;
68         }
69     }
70 }

Activity中的使用:

 1 package com.lfk.drawapictiure.Fragment;
 2
 3 import android.content.Intent;
 4 import android.net.Uri;
 5 import android.os.Bundle;
 6 import android.os.Environment;
 7 import android.support.v7.widget.LinearLayoutManager;
 8 import android.support.v7.widget.RecyclerView;
 9 import android.view.LayoutInflater;
10 import android.view.View;
11 import android.view.ViewGroup;
12
13 import com.lfk.drawapictiure.Adapter.MainLayoutAdapter;
14 import com.lfk.drawapictiure.Info.MenuInfo;
15 import com.lfk.drawapictiure.InterFace.MainItemClickListener;
16 import com.lfk.drawapictiure.MainActivity;
17 import com.lfk.drawapictiure.R;
18
19 import java.util.ArrayList;
20
21
22 public class PaintFragment extends android.support.v4.app.Fragment {
23     private RecyclerView mRecyclerView;
24     private MainLayoutAdapter mAdapter;
25     private RecyclerView.LayoutManager mLayoutManager;
26     private String path = Environment.getExternalStorageDirectory().getPath() + "/DrawAPicture";
27
28     public static PaintFragment newInstance() {
29         return new PaintFragment();
30     }
31
32     public PaintFragment() {
33         // Required empty public constructor
34     }
35
36     @Override
37     public void onCreate(Bundle savedInstanceState) {
38         super.onCreate(savedInstanceState);
39
40     }
41
42     @Override
43     public View onCreateView(LayoutInflater inflater, ViewGroup container,
44                              Bundle savedInstanceState) {
45         View wrapper = inflater.inflate(R.layout.fragment_paint, container, false);
46         mRecyclerView = (RecyclerView)wrapper.findViewById(R.id.paint_recycle_view);
47         mLayoutManager = new LinearLayoutManager(getActivity());
48         mRecyclerView.setLayoutManager(mLayoutManager); //绑上列表管理器
49         ArrayList<MenuInfo> arrayList = new ArrayList<>();
50         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
51         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
52         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
53         arrayList.add(new MenuInfo("刘丰恺","09-13 05:28",path+"/"+"12138.lfk",path+"/"+"6826.jpg"));
54         mAdapter = new MainLayoutAdapter(arrayList, getActivity());      // 设置点击事件
55         mAdapter.setItemClickListener(new MainItemClickListener() {
56             @Override
57             public void onItemClick(View view, String name, String path) {
58                 Intent intent = new Intent(getActivity(), MainActivity.class);
59                 intent.setData(Uri.parse(path));
60                 startActivity(intent);
61             }
62         });      //绑定数据集
63         mRecyclerView.setAdapter(mAdapter);
64
65         return wrapper;
66     }
67
68
69 }

其中的子布局使用了CardView:

我设置的东西只有:

card_view:cardCornerRadius="4dp"  //设定圆角半径

card_view:cardElevation="8dp"//设定阴影

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <android.support.v7.widget.CardView
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:card_view="http://schemas.android.com/apk/res-auto"
 5     android:background="@drawable/list_item_selector"
 6     android:layout_width="match_parent"
 7     android:layout_height="wrap_content"
 8     card_view:cardCornerRadius="4dp"    card_view:
 9     android:layout_margin="@dimen/card_margin">
10     <RelativeLayout
11         android:layout_marginTop="16dp"
12         android:layout_marginLeft="16dp"
13         android:layout_marginRight="16dp"
14         android:layout_marginBottom="16dp"
15         android:layout_width="match_parent"
16         android:layout_height="wrap_content">
17         <ImageView
18             android:maxHeight="100dp"
19             android:layout_marginTop="8dp"
20             android:layout_below="@+id/line_view"
21             android:layout_width="match_parent"
22             android:layout_height="wrap_content"
23             android:id="@+id/paint_img"
24             android:src="@mipmap/ic_launcher" />
25         <TextView
26             android:id="@+id/paint_name"
27             android:textColor="#000"
28             android:textSize="18sp"
29             android:text="项目名"
30             android:layout_alignParentRight="true"
31             android:singleLine="true"
32             android:layout_width="wrap_content"
33             android:layout_height="wrap_content" />
34         <TextView
35             android:id="@+id/paint_time"
36             android:text="项目时间"
37             android:textColor="@color/black"
38             android:textSize="18sp"
39             android:singleLine="true"
40             android:layout_width="wrap_content"
41             android:layout_height="wrap_content" />
42         <View
43             android:id="@+id/line_view"
44             android:background="@color/gray"
45             android:layout_below="@+id/paint_time"
46             android:layout_width="match_parent"
47             android:layout_height="1dp"/>
48         <TextView
49             android:id="@+id/paint_root"
50             android:visibility="invisible"
51             android:layout_width="wrap_content"
52             android:layout_height="wrap_content" />
53     </RelativeLayout>
54
55 </android.support.v7.widget.CardView>

这只是第一篇继续使用过程中发现新特性还会更新!

时间: 2024-10-14 15:54:53

RecycleView + CardView 控件简析的相关文章

Android RecycleView + CardView 控件简析

今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleView的“列表”样式,Support包默认包含了:LinearLayoutManager  横向或纵向的滚动列表. GridLayoutManager  网格列表.StaggeredGridLayoutManager  交错的网格列表. 2.Adapter负责处理RecycleView的数据和样式 3

Flutter样式和布局控件简析(二)

开始 继续接着分析Flutter相关的样式和布局控件,但是这次内容难度感觉比较高,怕有分析不到位的地方,所以这次仅仅当做一个参考,大家最好可以自己阅读一下代码,应该会有更深的体会. Sliver布局 Flutter存在着两大布局体系(就目前分析),一个是Box布局,还有另外一个就是Sliver布局:但是Sliver布局明显比Box会更加复杂,这真是一个坎,那么为啥说Sliver更加复杂尼,请看一下对比:首先是Box布局,主要看输入的BoxConstraints(约束)和输出Size(尺寸) cl

Android5.x 新控件之RecyclerView,CardView,Palette的使用

『转载注明出处:http://blog.csdn.net/feiduclear_up/article/details/46439005 CSDN废墟的树』 自Android5.0发布以来,谷歌推出全新的Material Desigen设计风格,时过一年多了,在国内也看到很多应用在慢 慢适应MD设计风格.其中比较好的app就是网易新闻客户端了,其设计风格基本符合MD要求.鉴于越来多App采 用MD设计风格,作为吊丝程序员的我们怎能落后呢?那就让我们来学习一些Android5.x新推出的一些控件吧.

使listview下的控件获取点击事件,android:descendantFocusability用法简析

开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点.原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,

Android L 新增UI控件:RecyclerView CardView的简单使用

源码下载:https://github.com/qyxxjd/RecyclerViewDemo RecyclerView: RecyclerView用来替代ListView,更好的性能而且更容易使用 该控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动,当你list中的元素经常动态改变时可以使用RecyclerView控件 标准化了ViewHolder,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了 为每个

全新android Tab控件PagerSlidingTabStrip最简使用方法

众所周知Android的Tab控件不是很好用,因此Github上的PagerSlidingTabStrip项目被广为使用,该项目地址为: https://github.com/astuetz/PagerSlidingTabStrip 其示例图如下: 由于其demo代码较长,难以理解,因此我总结了一个最简的使用方法. 第一,在ADT中导入PagerSlidingTabStrip中的library项目,若使用Android Studio则直接导入即可,若使用ADT则需参考我的上一篇文章进行导入: h

Android 布局之LinearLayout 子控件weight权重的作用详析

关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法二:值越大,重要性越低,所占用的空间越小. 到底哪个正确?哪个错误?抑或还有其他解释?请点击查看关于weight 权重参数作用的详分析: 其实这两种情况都不太准确: 准确的解释是,weight 权限 是用于分配父控件某一方向上尺寸-所有子控件在该方向上设定尺寸和 所得值的一个参数,把这个相减得到的结

Android5.0新控件CardView的介绍和使用

   CardView也是5.0的新控件,这控件其实就是一个卡片啦,当然我们自己也完全可以定义这样一个卡片,从现在的微博等社App中可以看到各式各样的自定义卡片,所以这个控件意义不是很大.比较是support中的view所以使用在布局里面的时候一下子看不到效果的,比较不好.CardView继承的是FrameLayout,所以摆放内部控件的时候需要注意一下啦. 建议:个人不是很建议用这个控件,因为我们完全可以自定义这样一个控件,这样既能在布局时直接看到效果又比较方便,关键问题是CardView中的

Material Design(三)--UI控件之CardView

CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角.(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了) Layout中为CardView设置圆角使用card_view:cardCornerRadius属性 代码中为CardView设置圆角使用CardView.setRadius方法 为CardView设置背景颜色使用card_view:cardBackgroundColor属