您的位置:首页 > 移动开发 > Android开发

Android之RecycleView和CardView

2017-05-12 17:23 405 查看

Android之RecycleView和CardView

之前在学习php并且公司交代了一些后台的任务让我练习php的后台开发,这个星期又把app的一些问题做了解决升级,今天难得没有很多的任务就去看了下Android5.0之后的一些改变和新的控件自己学习下,看的很多介绍RecycleView和CardView,我自己就去看了下,一这篇文章来记录自己对上面的控件的使用心得。先来看看相关的类的简介:

RecyclerView相关类:

类名说明
RecyclerView.Adapter

可以托管数据集合,为每一项Item创建视图并且绑定数据
RecyclerView.ViewHolder承载Item视图的子布局
RecyclerView.LayoutManager

负责Item视图的布局的显示管理
RecyclerView.ItemDecoration给每一项Item视图添加子View,可以进行画分隔线之类的东西
RecyclerView.ItemAnimator

负责处理数据添加或者删除时候的动画效果

刚开始了解没有使用这么多类,主要的就是前三个类的使用,RecycleView和listview 的用法差不多,recycleview是v7包中的,我们使用也很简单,主要就是布局管理器要做好选择:

1 LinearLayoutManager
线性布局,LayoutManager的实现类,类似于实现ListView的风格,一般

ListView只有垂直的方向,而这里可包含两种类型,Vertical和Horizontal
2 GridLayoutManager
格子布局、继承自LinearLayoutManager,实现效果类似GridView
3 StaggeredGridLayoutManager
瀑布流布局、交错的格子布局、同样也是LayoutManager的实现类,类型包括Vertical和Horizontal,与GridLayoutManager很相似,不过是交错的格子,也就是宽高不等的格子视图、类似瀑布流的效果。
比较蛋疼就是没有提供一些点击监听和长按监听的方法,我们需要掌握他的一些点击和长按事件,对于RecyclerView其本身没有给我们提供这些事件监听,所以,对于这些事件,我们还得自己去实现。
这里简单的实现一个瀑布流布局来看下效果:
protected void initView(){
recyclerView = (RecyclerView) findViewById(R.id.recycle);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
recyclerView.setHasFixedSize(true);
adapter = new DemoAdapter(resoures,this);
recyclerView.setAdapter(adapter);

}
上面一段代码给出了recycleview的初始化,和布局格式,再来看看适配器:
package com.example.luze.myapplication;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

/**
* Created by luze on 2017-05-12.
*/

public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.BaseViewHolder> {
private int[] resus;
private Context context;

public DemoAdapter(int[] resus, Context context) {
this.resus = resus;
this.context = context;
}

@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(context,R.layout.recycle_item,null);
return new OneViewHolder(view);
}

@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
holder.setData(resus[position]);
}

@Override
public int getItemCount() {
return resus.length;
}

public class BaseViewHolder extends RecyclerView.ViewHolder {
public BaseViewHolder(View itemView) {
super(itemView);
}
void setData(Object data){

}
}
public class OneViewHolder extends BaseViewHolder{
private ImageView image ;
public OneViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.id_image);
DisplayMetrics metrics = new DisplayMetrics();
((Activity)(image.getContext())).getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width =metrics.widthPixels;
ViewGroup.LayoutParams params = image.getLayoutParams();
params.width = width/3;
params.height = (int) (200+Math.random()*400);
image.setLayoutParams(params);
}

@Override
void setData(Object data) {
if (data != null){
int ID = (int) data;

image.setImageResource(ID);

}
}
}
}
看到适配器的代码和listview就有很大的区别了,不过仔细研究也比较简单,我们需要在ViewHolder中做数据绑定。recycleview就分享到这里,再来看看cardview。

下面我们看看CardView新增了哪些属性:

CardView_cardBackgroundColor 设置背景色
CardView_cardCornerRadius 设置圆角大小
CardView_cardElevation 设置z轴阴影
CardView_cardMaxElevation 设置z轴最大高度值
CardView_cardUseCompatPadding 是否使用CompadPadding
CardView_cardPreventCornerOverlap 是否使用PreventCornerOverlap
CardView_contentPadding 内容的padding
CardView_contentPaddingLeft 内容的左padding
CardView_contentPaddingTop 内容的上padding
CardView_contentPaddingRight 内容的右padding
CardView_contentPaddingBottom 内容的底padding

card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式

card_view:cardPreventConrerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠

至于cardview的把上面的的几个属性用好就可以,在代码中没有很多的涉及。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cardview recycleview