cardView:

添加依赖:在Studio搜索cardview即可 在V7包中

或者直接在gradle中添加

compile 'com.android.support:cardview-v7:24.0.0'

cardView 完成一些绚丽特效使用:

属性:

app:cardElevation=”10dp”添加景深 (阴影效果让其更立体)

app:cardCornerRadius=”10dp”四边圆角值

app:cardBackgroundColor=”@android:color/holo_blue_ligh”背景色

android:foreground=”?android:attr/selectableItemBackground” 用户点击时会生成涟漪效果

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:foreground="?android:attr/selectableItemBackground"
android:orientation="vertical"
app:cardBackgroundColor="@android:color/holo_blue_light"
app:cardCornerRadius="10dp"
app:cardElevation="10dp"> <TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp"
android:textColor="@android:color/white"
android:textSize="20sp" /> </android.support.v7.widget.CardView>

效果图:


RecyclerView :

同样需要添加依赖 和上诉一样.

compile ‘com.android.support:recyclerview-v7:24.0.0’

可以实现GridView ListView 和流布局并且可以指定方向,和数据颠倒等

使用方法和适配器介绍:

  1. 在布局文件写入RecyclerView

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="qianfeng.com.day38_recyclerview.MainActivity"> <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
    </RelativeLayout>
  2. 写布局管理器(多种) 和适配器:

    这里大家可以先不用管适配后面详解

    package qianfeng.com.day38_recyclerview;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.widget.Toast; import java.util.ArrayList;
    import java.util.List; /**java
    * RecyclerView:
    * 升级版的ListView 融合了 ListView GridView 瀑布流 横纵向滑动
    * RecyclerView 使用 LayoutManager 进行布局管理
    * 1.LinearLayoutManager 线性布局管理器 -- > 横向或纵向的ListView展示效果
    * 2.GridLayoutManager 网格布局管理器 ---> 横向或纵向的 GridView 展示效果
    * 3.StraggXXXXXXXXXX 瀑布流
    *
    * LayoutManager
    * 实例化的时候 参数 上下文对象,横竖展示标记, 反转
    *
    * recyclerView 通过setLayoutManager() 方式 设置 布局管理器
    *
    * RecyclerAdapter
    * 是抽象类
    * 需要继承与 RecyclerView.Adapter<VH></>
    *
    * 传入的 ViewHodler 对象 必须继承与 RecyclerView.ViewHolder
    * 并重写 含有ItemView 的 构造方法
    *
    * 继承 RecyclerView.Adapter<VH></>类之后 需要重写三个方法
    * 1.getItemCount
    * 返回数据源的长度
    * 2.onCreateViewHolder
    * 实例化 itmeView
    * 并创建ViewHolder 对象 将其返回
    * 3.onBindViewHolder
    * 数据源 与ViewHolder 的持有View 进行绑定
    *
    * 设置监听器
    * RecyclerView 本身并不含有监听器 需要自己添加
    *
    * 在适配器中定义接口及方法
    * 给ItemView设置监听 并 对外暴露出接口
    * 由RecyclerView 进行监听 点击事件
    *
    * 获取ItemView 的position
    * RecyclerView .getChildAdapterPosition(ItemView)
    *
    *
    * RecyclerView 没有分割线属性
    * 不推荐使用
    * LinearLayoutmanager 纵向模式下
    * 可以使用 DividerItemDecoration 进行 分割线修改
    *
    * recyclerView.addItemDecoration(); 添加分割线属性
    *
    * value -- style
    * 添加一个 android:listDivider 属性
    * 值 添加 shape 或者 图片 作为分割线展示
    * 如果只添加颜色 则 没有高度 无法展示
    *
    * 推荐使用的:(不需要分割线)
    *
    * CardView
    *
    *
    */
    public class MainActivity extends AppCompatActivity implements MyRecyclerAdapter.OnItemClickListener { private RecyclerView recyclerView;
    private List<String> list = new ArrayList<>();
    private MyRecyclerAdapter myRecyclerAdapter; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 实例化RecyclerView 对象
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); /**
    * 上下文对象
    * 方向
    * 是否反转
    * 如果翻转 数据颠倒并且进入界面时跳到最后显示第一个item(相当于正向的第一个数据item)
    * 如果方向是横向LinearLayoutManager.HORIZONTAL 那么整个activity只显示一个item,向右滑动即可显示下一个item和Viewpager相识
    */
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
    // GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4, LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(linearLayoutManager);
    // 添加自定义的 分割线 (不推荐)
    recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
    initData();
    // 设置适配器
    myRecyclerAdapter = new MyRecyclerAdapter(list, this, recyclerView, this);
    recyclerView.setAdapter(myRecyclerAdapter);
    } private void initData() {
    for (int i = 0; i < 50; i++) {
    list.add("哈哈哈哈" + i);
    }
    }
    //以下监听为我们在适配器中添加的
    @Override
    public void onItemClickListener(int position) {
    Toast.makeText(MainActivity.this, "点击————" + position, Toast.LENGTH_LONG).show();
    } @Override
    public void onItemLongClickListener(int position) {
    Toast.makeText(MainActivity.this, "长按————" + position, Toast.LENGTH_LONG).show();
    } }

    效果图:

    如果上诉案例写成竖直方向:

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    效果图

    • 反向:大家可以自己试试:这里直接说结果,上诉竖直方向会直接滑到哈哈0 (此时哈哈0是在列表底部的注意)

    上诉案例:用改用gridlayout

    //没行4个
    GridLayoutManager(this, 4, LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(gridLayoutManager);

    效果图:



    另一个方向参考上一个Linear案例

    适配器

package qianfeng.com.day38_recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; import java.util.List; /**
* Created by ${Mr.Zhao} on 2016/10/19.
*/
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { List<String> list;
Context context;
LayoutInflater inflater;
RecyclerView recyclerView; private OnItemClickListener listener; public interface OnItemClickListener {
public void onItemClickListener(int position); public void onItemLongClickListener(int position); } public MyRecyclerAdapter(List<String> list, Context context, RecyclerView recyclerView, OnItemClickListener listener) {
this.list = list;
this.context = context;
this.recyclerView = recyclerView;
inflater = LayoutInflater.from(context);
this.listener = listener;
} // 该方法为 创建ViewHolder 使用
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 实例化 itemView
View view = inflater.inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
} // 该方法为 绑定数据使用
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.item_tv.setText(list.get(position));
} // 返回数据长度
@Override
public int getItemCount() {
return list.size();
} // 定义 ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView item_tv; // 必须实现的有参构造
public MyViewHolder(final View itemView) {
super(itemView);
// 实例化 textView
item_tv = ((TextView) itemView.findViewById(R.id.item_tv)); itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取itemView 的 位置
int childPosition = recyclerView.getChildAdapterPosition(itemView);
// 监听方法
listener.onItemClickListener(childPosition);
}
}); itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int childAdapterPosition = recyclerView.getChildAdapterPosition(itemView);
listener.onItemLongClickListener(childAdapterPosition);
return true;
}
});
}
}
}
  • 一个分割线类
package qianfeng.com.day38_recyclerview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View; /**
* ListView 模式 下的 下划线
* Created by ${Mr.Zhao} on 2016/5/26.
*
* 可以自由更改分割线 android.R.attr.listDivider
* 去 values 的 styles 下 添加 android:listDivider 属性 在面的值 可以任意修改
* 图片或者颜色 或者 Drawable 资源
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
}; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
} public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
} @Override
public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
} } public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
RecyclerView v = new RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
} public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
} @Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
} }

多布局

适配器中有多个viewhold然后根据 返回类型确定用哪个viewhold

package com.example.administrator.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView;
private GridLayoutManager linearLayoutManager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
linearLayoutManager = new GridLayoutManager(this,3,GridLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(linearLayoutManager);
Myadapter myadapter = new Myadapter();
recyclerView.setAdapter(myadapter);
//找到第一个显示的位置
linearLayoutManager.findFirstVisibleItemPosition();
//找到最后一个显示的位置
linearLayoutManager.findLastVisibleItemPosition();
new Thread(){
@Override
public void run() {
while (true){
try {
sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e("tag", linearLayoutManager.findFirstVisibleItemPosition()+"");
}
}
}.start();
} class Myadapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ class MyViewHold extends RecyclerView.ViewHolder{ public MyViewHold(View itemView) {
super(itemView);
}
} class MyViewHold2 extends RecyclerView.ViewHolder{ public MyViewHold2(View itemView) {
super(itemView);
}
} //自定义一个返回类型实现多布局
@Override
public int getItemViewType(int position) { return super.getItemViewType(position); } @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = getLayoutInflater().inflate(R.layout.item, parent, false);
MyViewHold2 myViewHold2= new MyViewHold2(inflate) ; //这里可以自定义适配器viewhold实现多布局
/* switch (viewType){
default:
}*/ return myViewHold2;
} @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MyViewHold2){ }else if (holder instanceof MyViewHold){ }
} @Override
public int getItemCount() {
return 500;
}
} }

安卓高级3 RecyclerView 和cardView使用案例的更多相关文章

  1. 安卓高级3 RecyclerView结合SwipeRefreshLayout并添加上拉

    目录结构: 效果图: MainActivity.java package qianfeng.com.pullrecyclerviewdemo; import android.os.Bundle; im ...

  2. 安卓高级2 Volley框架的使用案例

    初始化类: MyApp.java package qianfeng.com.day37_volley_pull.app; import android.app.Application; import ...

  3. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...

  4. 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

    安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...

  5. RecyclerView 结合 CardView 使用

    准备工作:导入 1.activity_mian.xml <android.support.v7.widget.RecyclerView android:id="@+id/recycle ...

  6. Android L 之 RecyclerView 、CardView 、Palette

    转: http://blog.csdn.net/xyz_lmn/article/details/38735117 <Material Design>提到,Android L版本中新增了Re ...

  7. Android L中间RecyclerView 、CardView 、Palette使用

    RecyclerView CardView Palette <Material Design>提到,Android L版本号中新增了RecyclerView.CardView .Palet ...

  8. 【android】使用RecyclerView和CardView,实现知乎日报精致布局

    完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 在写博客园客户端的时候,突然想到,弄个知乎日报风格的简单清爽多好!不需要那么多繁杂的 ...

  9. Android L中的RecyclerView 、CardView 、Palette的使用

    <Material Design>提到,Android L版本中新增了RecyclerView.CardView .Palette.RecyclerView.CardView为用于显示复杂 ...

随机推荐

  1. bcrypt对密码加密的一些认识(学习笔记)

    学习nodejs和mongoDB的时候,接触了用户注册和登录的一些知识. 1.关于增强用户密码的安全性 用户的密码肯定不能保存为明文,避免撞库攻击. 撞库攻击:撞库是一种针对数据库的攻击方式,方法是通 ...

  2. 网络流入门-POJ1459PowerNetwork-Dinic模板

    (我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!) (Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~ 这是本人网络流入门第二题,不知道怎 ...

  3. [SHOI2008]cactus仙人掌图

    [题目描述] 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例 ...

  4. 2-XOR-SAT

    [题目描述]SAT(Satisfiability,可满足性)问题是著名的 NP 完全问题,它的内容是:判断由有限个布尔变量及其“非”用“或”操作连接起来的表达式组是否可以都为 TRUE.2-SAT 问 ...

  5. 区间(interval)

    [问题描述]给定 N 个区间, 要求选出若干个区间 A1, A2, A3... Am (m > 1), 使得:|A1∩A2∩A3...∩Am| * |A1∪A2∪A3...∪Am|最大.[输入格 ...

  6. poj 1741 树的点分治(入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18205   Accepted: 5951 Description ...

  7. CTSC2017 铁牌记

    Day 0: 先到了丽都酒店. 看见北京八十中学生在发胸牌手册和T恤,领完之后开始分房间. 我和ryc一屋,lyd和ysq一屋,yzy和gzz分到了珀利酒店,老师尝试了半天把我们分到一个酒店,失败了. ...

  8. python+eclipse+pydev开发环境搭建

    1.安装配置python2.7(右击我的电脑->属性->高级系统设置->环境变量->系统变量列表中找到Path并双击->变量值中添加";C:\Python27; ...

  9. 使设备I/O的核心模块工作,有哪两种方式?

    设备处理进程方式.文件操作方式.

  10. 基于SSM框架实现简单的登录注册

    一.环境配置 工程目录 在pom.xml添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...