.效果图

.实现步骤

1.XML布局-添加依赖

     <LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Linear"/>
<Button
android:id="@+id/btn_simple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Simple"/>
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="add"
/> </LinearLayout> <android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/layout">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</android.support.v7.widget.RecyclerView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/flaot_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
>
</android.support.design.widget.FloatingActionButton>
</android.support.design.widget.CoordinatorLayout>

XML布局

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
>
<TextView
android:id="@+id/tv_cyc_item"
style="@style/CycStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:gravity="center"
android:textColor="@android:color/white"/>
</LinearLayout>

RecyclerView-Item布局

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_red_dark" android:state_pressed="true"/>
<item android:drawable="@android:color/holo_blue_dark"></item>
</selector>

Item点击变色Style

 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.ArrayList; public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyDivViewHolder>{
ArrayList<String> arrayList;
Context context;
public AdapterRecyclerView(ArrayList<String> arrayList,Context con){
this.arrayList=arrayList;
this.context=con;
}
@Override
public MyDivViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
MyDivViewHolder myDivViewHolder=new MyDivViewHolder(layoutInflater.inflate(R.layout.recyclerview_item,parent,false));
return myDivViewHolder;
}
@Override
public void onBindViewHolder(MyDivViewHolder holder, int position) {
MyDivViewHolder myDivViewHolder=holder;
myDivViewHolder.tv.setText(arrayList.get(position));
}
@Override
public int getItemCount() {
return arrayList.size();
}
class MyDivViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyDivViewHolder(View view){
super(view);
tv=(TextView)view.findViewById(R.id.tv_cyc_item);
}
}
}

RecyclerView.Adapter实现

     void initEvent(){
arrayList=new ArrayList<String>();
for(int i='A';i<'Z';i++){
arrayList.add(""+(char)i);
}
//adapter 绑定
AdapterRecyclerView adapter=new AdapterRecyclerView(arrayList,getApplicationContext());
cycView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
cycView.setAdapter(adapter);
}

Adapter绑定

2.瀑布流初步实现效果

3.Item高度随机设置

适配器中设置TextView显示高度

     public void onBindViewHolder(MyDivViewHolder holder, int position) {
MyDivViewHolder myDivViewHolder=holder;
ViewGroup.LayoutParams lp = myDivViewHolder.tv.getLayoutParams();
lp.height =stragger_random_height==0? 80: 50+new Random().nextInt(stragger_random_height)*5;
myDivViewHolder.tv.setLayoutParams(lp);
myDivViewHolder.tv.setText(arrayList.get(position));
}
//添加 高度设置变量及函数
int stragger_random_height=0;
public void setStragger_random_height(int stragger_random_height) {
this.stragger_random_height = stragger_random_height;
}

TextView设置

 //adapter 绑定
AdapterRecyclerView adapter=new AdapterRecyclerView(arrayList,getApplicationContext());
adapter.setStragger_random_height(100);
cycView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
cycView.setAdapter(adapter);

绑定适配器时设置随机高度参数

运行效果图:

4.Item点击动画设置(点击选中是Y轴180度转动,拖动后X轴180度转动)及Item移动及滑动删除

ItemTouchHelper.Callback实现
 import android.animation.ObjectAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import java.util.ArrayList;
import java.util.Collections;
public class MyItemTouchHelper extends ItemTouchHelper.Callback{ RecyclerView.Adapter mAdapter;
ArrayList<String> arrayList;
RecyclerView.ViewHolder vh;
public void setArrayList(ArrayList<String> arrayList) {
this.arrayList = arrayList;
}
public void setmAdapter(RecyclerView.Adapter mAdapter) {
this.mAdapter = mAdapter;
} @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
arrayList.remove(viewHolder.getAdapterPosition());// 将数据集中的数据移除
mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());// 刷新列表
}
/*获取移动标志*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 拖拽的标记,这里允许上下左右四个方向
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;// 滑动的标记,这里允许左右滑动
return makeMovementFlags(dragFlags, swipeFlags);
}
/*当一个Item被另外的Item替代时回调,也就是数据集的内容顺序改变*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(arrayList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
} /*Item是否可以长按 */
@Override
public boolean isLongPressDragEnabled() {
return true;
}
/* Item是否可以滑动*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/* 当某个Item被滑动离开屏幕之后回调*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (viewHolder != null) {
vh = viewHolder;
pickUpAnimation(viewHolder.itemView);
} else {
if (vh != null) {
putDownAnimation(vh.itemView);
}
}
}
/*放下动画*/
private void putDownAnimation(View view){
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationY",0,180,0);//Y轴变动
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(500);
animator.start();
}
/*托起动画*/
private void pickUpAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationX",0,180,0);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(500);
animator.start();
}
}

创建继承ItemTouchHelper类MyItemTouchHelper

ItemTouchHelper与RecyclerView绑定

 void initEvent(){
arrayList=new ArrayList<String>();
for(int i='A';i<'Z';i++){
arrayList.add(""+(char)i);
}
//adapter 绑定
AdapterRecyclerView adapter=new AdapterRecyclerView(arrayList,getApplicationContext());
adapter.setStragger_random_height(100);
cycView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
cycView.setAdapter(adapter);
//ItemTouchHelper绑定RecyclerView
MyItemTouchHelper myItemTouchHelper=new MyItemTouchHelper();
myItemTouchHelper.setArrayList(arrayList);
myItemTouchHelper.setmAdapter(adapter);
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(myItemTouchHelper);
itemTouchHelper.attachToRecyclerView(cycView);
}

ItemTouchHelper绑定RecyclerView

运行效果图:

5.FloatingActionButton返回RecyclerView顶部

 cycView.smoothScrollToPosition(0);

RecyclerView返回顶部

运行效果图:

6.3个类的全部源码

 package rgsc.recyclerviewactivity;

 import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ RecyclerView cycView;
Button btn_linear;
Button btn_add;
Button btn_simple;
FloatingActionButton fb;
ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initControl();
initEvent();
}
void initControl(){
fb=(FloatingActionButton)findViewById(R.id.flaot_btn);
cycView=(RecyclerView)findViewById(R.id.recycle_view);
btn_linear=(Button)findViewById(R.id.btn_linear);
btn_simple=(Button)findViewById(R.id.btn_simple);
btn_add=(Button)findViewById(R.id.btn_add); fb.setOnClickListener(this);
btn_add.setOnClickListener(this);
btn_simple.setOnClickListener(this);
btn_linear.setOnClickListener(this);
}
void initEvent(){
arrayList=new ArrayList<String>();
for(int i='A';i<'Z';i++){
arrayList.add(""+(char)i);
}
//adapter 绑定
AdapterRecyclerView adapter=new AdapterRecyclerView(arrayList,getApplicationContext());
adapter.setStragger_random_height(100);
cycView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
cycView.setAdapter(adapter);
//ItemTouchHelper绑定RecyclerView
MyItemTouchHelper myItemTouchHelper=new MyItemTouchHelper();
myItemTouchHelper.setArrayList(arrayList);
myItemTouchHelper.setmAdapter(adapter);
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(myItemTouchHelper);
itemTouchHelper.attachToRecyclerView(cycView);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_linear://LinearLayout 布局
break;
case R.id.btn_simple:
break;
case R.id.btn_add:
break;
case R.id.flaot_btn:
cycView.smoothScrollToPosition(0);
break;
}
} }

MainActivity

 package rgsc.recyclerviewactivity;
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.ArrayList;
import java.util.Random;
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyDivViewHolder>{
ArrayList<String> arrayList;
Context context;
int stragger_random_height=0;
public AdapterRecyclerView(ArrayList<String> arrayList,Context con){
this.arrayList=arrayList;
this.context=con;
}
@Override
public MyDivViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
MyDivViewHolder myDivViewHolder=new MyDivViewHolder(layoutInflater.inflate(R.layout.recyclerview_item,parent,false));
return myDivViewHolder;
}
@Override
public void onBindViewHolder(MyDivViewHolder holder, int position) {
MyDivViewHolder myDivViewHolder=holder;
ViewGroup.LayoutParams lp = myDivViewHolder.tv.getLayoutParams();
lp.height =stragger_random_height==0? 80: 50+new Random().nextInt(stragger_random_height)*5;
myDivViewHolder.tv.setLayoutParams(lp);
myDivViewHolder.tv.setText(arrayList.get(position));
}
@Override
public int getItemCount() {
return arrayList.size();
}
public void setStragger_random_height(int stragger_random_height) {
this.stragger_random_height = stragger_random_height;
}
class MyDivViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyDivViewHolder(View view){
super(view);
tv=(TextView)view.findViewById(R.id.tv_cyc_item);
}
}
}

AdapterRecyclerView

 package rgsc.recyclerviewactivity;

 import android.animation.ObjectAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import java.util.ArrayList;
import java.util.Collections;
public class MyItemTouchHelper extends ItemTouchHelper.Callback{ RecyclerView.Adapter mAdapter;
ArrayList<String> arrayList;
RecyclerView.ViewHolder vh;
public void setArrayList(ArrayList<String> arrayList) {
this.arrayList = arrayList;
}
public void setmAdapter(RecyclerView.Adapter mAdapter) {
this.mAdapter = mAdapter;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
arrayList.remove(viewHolder.getAdapterPosition());// 将数据集中的数据移除
mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());// 刷新列表
}
/*获取移动标志*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 拖拽的标记,这里允许上下左右四个方向
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;// 滑动的标记,这里允许左右滑动
return makeMovementFlags(dragFlags, swipeFlags);
}
/*当一个Item被另外的Item替代时回调,也就是数据集的内容顺序改变*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(arrayList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
}
/*Item是否可以长按 */
@Override
public boolean isLongPressDragEnabled() {
return true;
}
/* Item是否可以滑动*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/* 当某个Item被滑动离开屏幕之后回调*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (viewHolder != null) {
vh = viewHolder;
pickUpAnimation(viewHolder.itemView);
} else {
if (vh != null) {
putDownAnimation(vh.itemView);
}
}
}
/*放下动画*/
private void putDownAnimation(View view){
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationY",0,180,0);//Y轴变动
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(500);
animator.start();
}
/*托起动画*/
private void pickUpAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationX",0,180,0);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(500);
animator.start();
}
}

MyItemTouchHelper

RecyclerView+FloatingActionButton应用的更多相关文章

  1. 高级UI-FloatingActionButton

    FloatingActionButton为悬浮按钮,就是常见的那种悬浮在控件上,可以调出其他菜单的按钮 FloatingActionButton的特有属性 app:backgroundTint 按钮的 ...

  2. 2.9 学习总结 之 【Android】体温统计APP

    一.说在前面 昨天 学习了JQ的相关知识 今天 编写体温统计APP 我的工程源码:https://github.com/xiaotian12-call/Take-body-temperature 二. ...

  3. 伴随ListView、RecyclerView、ScrollView滚动滑入滑出小图标--第三方开源--FloatingActionButton

    FloatingActionButton在github上的项目主页是:https://github.com/makovkastar/FloatingActionButton 它的依赖包NineOldA ...

  4. 浅谈RecyclerView(完美替代ListView,GridView)

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

  5. RecyclerView的使用(二)

    上篇博客讲了如何导入RecyclerView . 本章将告诉小伙伴们怎么使用RecyclerView : 第一步:在布局中使用RecyclerView并且绑定控件: 第二步:自定义Adapter:(继 ...

  6. 浅谈FloatingActionButton(悬浮按钮)

    一.介绍 这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性 android.support.design.widget.FloatingActionButt ...

  7. 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...

  8. 【Android - MD】之FloatingActionButton的使用

    FloatingActionButton(FAB) 是 Android 5.0 新特性--Material Design 中的一个控件,是一种悬浮的按钮. FloatingActionButton 是 ...

  9. Material Design之FloatingActionButton的使用

    FloatingActionButton是继承至ImageView,所以FloatingActionButton拥有ImageView的全部属性. CoordinatorLayout能够用来配合Flo ...

随机推荐

  1. Vivado ILA观察信号和调试过程

    先简单介绍一下ILA(Integrated Logic Analyzer)生成方法.这里有两种办法完成Debug Core的配置和实现. 方法一.mark_debug综合选项+Set Up Debug ...

  2. MyISAM与InnoDB 的区别

    1. 事务:InnoDB支持,MyISAM不支持,在InnoDB中每一条SQL语句都会默认封装成事务自动提交,然而这样会影响速度,因此最好把多条SQL语句放在begin和commit之间组成一个事务: ...

  3. MAC 终端编辑完成后如何保存:

    如果是vi,则:Esc 退出编辑模式,输入以下命令: :wq 保存后退出vi,若为 :wq! 则为强制储存后退出(常用):w 保存但不退出(常用):w! 若文件属性为『只读』时,强制写入该档案:q 离 ...

  4. HiBench成长笔记——(5) HiBench-Spark-SQL-Scan源码分析

    run.sh #!/bin/bash # Licensed to the Apache Software Foundation (ASF) under one or more # contributo ...

  5. Easy_Re

    这题比较简单,一波常规的操作之后直接上ida(小白的常规操作在以前的博客里都有所以这里不在赘述了),ida打开之后查看一下, 这里应该就是一个入口点了,接着搜索flag字符串, 上面的黄色的部分转换成 ...

  6. vue 加载静态图片

    <img class="headImg" :src="require('../../assets/uploads/'+headImg)" alt=&quo ...

  7. C# log4net相关配置说明

    添加相关文件到工程 链接: https://pan.baidu.com/s/1o83Juo6 密码: inkg 下载附件, 把里的log4net.dll 和 log4net.config 复制到工程目 ...

  8. qq群的表设计探究

    2018年3月21日  课题组管理就如qq的群是一样的,课题组有课题组组长:qq群有群主:课题组有组员:qq群有群人员 对于一个课题组来说,组长可以对课题组进行修改,组员只能看得见,但是不能修改.所以 ...

  9. CharacterEncodingFilter详解及源码解析

    字符编码过滤器  (Spring框架对字符编码的处理) 基于函数回调,对所有请求起作用,只在容器初始化时调用一次,依赖于servlet容器. web.xml配置文件 <filter> &l ...

  10. 十五、React:简单点餐实例:知识点,html解析写法

    一.功能 从首页列表点进去,转到详情页 列表.详情从Api获取 Api列表:http://a.itying.com/api/productlist 详情:http://a.itying.com/api ...