一、添加依赖
dependencies { compile 'com.android.support:recyclerview-v7:26.1.0' }
点击右上角Sync Now
不会添加依赖或添加依赖出现错误,请见这篇文章
https://blog.csdn.net/weimeig/article/details/80244059
二、列表效果实现
(一)、为RecyclerView添加填错数据的item
1、 cardElevation:设置阴影的大小
2、 cardBackgroundColor:卡片布局的背景颜色
3、 cardCornerRadius:卡片布局的圆角的大小
4、 conentPadding:卡片布局和内容之间的距离
5、android:clickable="true"
6、android:foreground="?android:attr/selectableItemBackground"设置点击的水波纹效果
7、cardUseCompatPadding:是否设置内边距
item_view.xml
<?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_gravity="center" app:cardBackgroundColor="#eee" app:cardCornerRadius="10dp" app:contentPadding="10dp" app:cardElevation="10dp" app:cardUseCompatPadding="true"> <ImageView android:id="@+id/img_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" android:layout_gravity="center"/> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地中海" android:textSize="20sp" android:textColor="#716f80" android:layout_gravity="center_horizontal" /> </android.support.v7.widget.CardView>
(二)、创建使用RecyclerView的布局xml
activitity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.administrator.cardvieweaxmple.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> </android.support.constraint.ConstraintLayout>
(三)、创建数据的实体类
CityEntity.java
package com.administrator.cardvieweaxmple; /** * Created by Administrator on 2018/5/12. */ public class CityEntity { int iconId; String name; public CityEntity(int iconId, String name) { this.iconId = iconId; this.name = name; } public int getIconId() { return iconId; } public void setIconId(int iconId) { this.iconId = iconId; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
(四)、创建生成模拟数据的工具类
DataUtil.java
package com.administrator.cardvieweaxmple; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2018/5/12. * 定义数据源 */ public class DataUtil { public static List<CityEntity> getData(){ List<CityEntity> cityEntities = new ArrayList<>(); for(int i = 0 ;i<10;i++){ CityEntity city = new CityEntity(R.mipmap.ic_launcher,"地中海"); cityEntities.add(city); CityEntity city2 = new CityEntity(R.mipmap.ic_launcher,"日韩线"); cityEntities.add(city2); CityEntity city3 = new CityEntity(R.mipmap.ic_launcher,"旅游热线"); cityEntities.add(city3); } return cityEntities; } }
(五)、界面引用处设置RecyclerView的适配器和调用
MainActivity.java
package com.administrator.cardvieweaxmple; 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.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<CityEntity> cities; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview); cities = DataUtil.getData(); //设置RecyclerView布局的样式 new LinearLayoutManager()列表 new GridLayoutManager()网格 new StaggeredGridLayoutManager()瀑布流 mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //将适配器设置给控件 mRecyclerView.setAdapter(new XueXiAdapter()); } class XueXiAdapter extends RecyclerView.Adapter<XueXiViewHolder>{//这里的泛型使用刚才定义的XueXiViewHolder即可实现接收 @Override public XueXiViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_view,null); return new XueXiViewHolder(view); } @Override public void onBindViewHolder(XueXiViewHolder holder, int position) {//这里的holder使用刚才定义的XueXiViewHolder即可实现接收 CityEntity city = cities.get(position); holder.mImgIcon.setImageResource(city.getIconId()); holder.mTvName.setText(city.getName()); } @Override public int getItemCount() { return cities.size(); } } class XueXiViewHolder extends RecyclerView.ViewHolder{ ImageView mImgIcon; TextView mTvName; public XueXiViewHolder(View itemView) { super(itemView); mImgIcon = (ImageView)itemView.findViewById(R.id.img_icon); mTvName = (TextView)itemView.findViewById(R.id.tv_name); } } }
三、瀑布流效果实现
直接在调用的页面,如本Demo中调用的页面MainActivity.java中的onCreate()方法里面增加
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));//瀑布流 参数1:列数。参数2:方向
即可实现瀑布流效果
但是,这个瀑布流过于规则了,那么,要怎么打乱瀑布流的出现效果实现不规则呢?
创建瀑布流分割方法XueXiItemDecoation(),继承RecyclerView.ItemDecoration();
/** * 设置分割线的效果 */ class XueXiItemDecoation extends RecyclerView.ItemDecoration{ int space; public XueXiItemDecoation(int space){ this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); /** * 设置交错的效果 */ //获取子条目View的位置 if(parent.getChildAdapterPosition(view)%2==0){//如果view是第2条 outRect.top=50; }else{ outRect.top = space; } //设置分割线四个方向的距离 // outRect.top = space; outRect.bottom = space; outRect.left = space; outRect.right = space; } }
onCreate方法中调用
//添加一个子条目的分割线 mRecyclerView.addItemDecoration(new XueXiItemDecoation(20));
完整代码如下:MainActivity.java
package com.administrator.cardvieweaxmple; import android.graphics.Rect; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<CityEntity> cities; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview); cities = DataUtil.getData(); //设置RecyclerView布局的样式 new LinearLayoutManager()列表 new GridLayoutManager()网格 new StaggeredGridLayoutManager()瀑布流 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));//瀑布流 参数1:列数。参数2:方向 //添加一个子条目的分割线 mRecyclerView.addItemDecoration(new XueXiItemDecoation(20)); //将适配器设置给控件 mRecyclerView.setAdapter(new XueXiAdapter()); } /** * 设置分割线的效果 */ class XueXiItemDecoation extends RecyclerView.ItemDecoration{ int space; public XueXiItemDecoation(int space){ this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); /** * 设置交错的效果 */ //获取子条目View的位置 if(parent.getChildAdapterPosition(view)%2==0){//如果view是第2条 outRect.top=50; }else{ outRect.top = space; } //设置分割线四个方向的距离 // outRect.top = space; outRect.bottom = space; outRect.left = space; outRect.right = space; } } class XueXiAdapter extends RecyclerView.Adapter<XueXiViewHolder>{//这里的泛型使用刚才定义的XueXiViewHolder即可实现接收 @Override public XueXiViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_view,null); return new XueXiViewHolder(view); } @Override public void onBindViewHolder(XueXiViewHolder holder, int position) {//这里的holder使用刚才定义的XueXiViewHolder即可实现接收 CityEntity city = cities.get(position); holder.mImgIcon.setImageResource(city.getIconId()); holder.mTvName.setText(city.getName()); } @Override public int getItemCount() { return cities.size(); } } class XueXiViewHolder extends RecyclerView.ViewHolder{ ImageView mImgIcon; TextView mTvName; public XueXiViewHolder(View itemView) { super(itemView); mImgIcon = (ImageView)itemView.findViewById(R.id.img_icon); mTvName = (TextView)itemView.findViewById(R.id.tv_name); } } }