我们先看下效果图:

效果还是很不错的。

实现思路:

设置recyclerview为GridLayoutManager布局,单行个数为4个

GridLayoutManager linearLayoutManager = new GridLayoutManager(this, 4);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);rvAddNewView.setLayoutManager(linearLayoutManager);

然后根据adapter里面的getViewType判断是添加按钮还是添加的文字内容

  @Overridepublic int getItemViewType(int position) {if (position == addViewed.size()) {return FooterNum;} else {return Normal;}}

然后设置GridLayoutManager间距,我们通过另外的方法实现:

下面是设置GridLayoutManager间距的工具类

package cn.yhsh.recyclerviewadd;import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;/*** @author DELL*/
public class RecyclerItemDecoration extends RecyclerView.ItemDecoration {private int itemSpace;private int itemNum;/*** @param itemSpace item间隔* @param itemNum   每行item的个数*/public RecyclerItemDecoration(int itemSpace, int itemNum) {this.itemSpace = itemSpace;this.itemNum = itemNum;}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);outRect.bottom = itemSpace;//parent.getChildLayoutPosition(view) 获取view的下标if (parent.getChildLayoutPosition(view) % itemNum == 0) {outRect.left = 0;} else {outRect.left = itemSpace;}}
}

看下如何调用:

一行代码简单调用:
rvAddNewView.addItemDecoration(new RecyclerItemDecoration(20,4));

不错吧。

我们粘贴下主要核心代码

MainActivity.java文件

package cn.yhsh.recyclerviewadd;import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;import java.util.ArrayList;
import java.util.List;/*** @author DELL* 2019年4月8日16:57:55*/
public class MainActivity extends Activity {private RecyclerView rvAddNewView;private List<String> addViewed = new ArrayList<>(16);int i = 0;private AddDataAdapter addDataAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rvAddNewView = findViewById(R.id.rv_add_new_view);GridLayoutManager linearLayoutManager = new GridLayoutManager(this, 4);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);rvAddNewView.setLayoutManager(linearLayoutManager);addDataAdapter = new AddDataAdapter(addViewed);rvAddNewView.addItemDecoration(new RecyclerItemDecoration(20,4));rvAddNewView.setAdapter(addDataAdapter);addDataAdapter.setAddDataListener(new AddDataAdapter.addDataListener() {@Overridepublic void onAddDataListener(int position) {i++;addViewed.add("【下一页5】" + i);addDataAdapter.notifyDataSetChanged();}});addDataAdapter.setLongClickListenerRemove(new AddDataAdapter.longClickListenerRemove() {@Overridepublic void setLongClickListener(View view) {addViewed.remove(rvAddNewView.getChildLayoutPosition(view));addDataAdapter.notifyDataSetChanged();}});}
}

再来看下适配器代码:

package cn.yhsh.recyclerviewadd;import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;import java.util.List;/*** @author DELL*/
public class AddDataAdapter extends RecyclerView.Adapter<AddDataAdapter.VH> {private List<String> addViewed;private final int Normal = 1;private final int FooterNum = 2;private View footerView;private View normalView;public AddDataAdapter(List<String> addViewed) {this.addViewed = addViewed;}@NonNull@Overridepublic VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {if (i == FooterNum) {footerView = View.inflate(viewGroup.getContext(), R.layout.activity_footer_view, null);return new VH(footerView);} else {normalView = View.inflate(viewGroup.getContext(), R.layout.activity_normal_view, null);return new VH(normalView);}}@Overridepublic void onBindViewHolder(@NonNull final VH vh, final int i) {if (addViewed.size() != i) {vh.tvClickAddTextButton.setText(addViewed.get(i));vh.tvClickAddTextButton.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {longClickListenerRemove.setLongClickListener(v);return true;}});}}@Overridepublic int getItemCount() {return addViewed.size() + 1;}@Overridepublic int getItemViewType(int position) {if (position == addViewed.size()) {return FooterNum;} else {return Normal;}}class VH extends RecyclerView.ViewHolder {private TextView tvClickAddTextButton;private TextView tvAddTextButton;public VH(@NonNull final View itemView) {super(itemView);if (itemView == normalView) {tvClickAddTextButton = (TextView) itemView.findViewById(R.id.tv_click_add_text);} else {tvAddTextButton = (TextView) itemView.findViewById(R.id.tv_add_text_button);tvAddTextButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(itemView.getContext(), "点击了添加按钮", Toast.LENGTH_SHORT).show();addDataListener.onAddDataListener(getLayoutPosition());}});}}}addDataListener addDataListener;longClickListenerRemove longClickListenerRemove;public void setLongClickListenerRemove(AddDataAdapter.longClickListenerRemove longClickListenerRemove) {this.longClickListenerRemove = longClickListenerRemove;}public void setAddDataListener(AddDataAdapter.addDataListener addDataListener) {this.addDataListener = addDataListener;}interface addDataListener {void onAddDataListener(int position);}interface longClickListenerRemove {void setLongClickListener(View view);}
}

再来看下主要布局代码:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_add_new_view"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

添加数据的布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tv_click_add_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/shape_bg"android:padding="5dp"android:gravity="center"android:text="测试数据"></TextView>

点击添加数据的按钮布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tv_add_text_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="添加数据"></TextView>

如果看不懂可下载我源码:点击下载

注意:下载后记得导入module!!!否则错误!!

增加GitHub源码下载:

Java版本下载

Java版本和Kotlin版本下载

Android开发之RecyclerView动态添加item长按删除item源码相关推荐

  1. Android开发之RecyclerView的交互动画(实现拖拽和删除)

    做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...

  2. android gridview 间隔线,Android开发之RecyclerView的间隔线处理

    RecyclerView没有默认的分割线,需要自己绘制,接下来我会为大家绘制三种线:水平线.竖直线.和网格线. 废话少说,马上开车!!! ------------------------------- ...

  3. Android高级开发之【RxJava】详解(附项目源码)

    文章大纲 一.什么是RxJava 二.为什么要用RxJava 三.RxJava使用详解 四.项目源码下载 一.什么是RxJava Rx(Reactive Extensions)是一个库,用来处理事件和 ...

  4. android开发actionbar,Android 开发之为ActionBar 添加Actionbar Button

    前几天做App 的时候,做的比较仓促,就没有添加返回按钮,还有就是MainActivity 的Theme 怎么传递到其他Activity 中,今天无意中看到官方的Train,所以就记下来啦,顺便吧Ac ...

  5. Android开发之 permission动态权限获取

    权限查看:戳这里 在文章最后附上DEMO DEMO效果: 一.说明: 1.支持单个权限.多个权限.单个权限组.多个权限组请求 2.不指定权限则自动获取清单文件上的危险权限进行申请 3.如果动态申请的权 ...

  6. Android开发之RecyclerView嵌套ListView自动计算高度的方法

    老套路看图:下面是我在我爱我家在职时候做的一个小需求记录下 最外层是个RecylerView子布局里面的房屋描述信息是个listview根据后台返回字段动态显示的高度. 解决思路:可以计算每个list ...

  7. Android开发之RecyclerView滑动到底部的监听方法

    Kotlin版本 recyclerview.addOnScrollListener(object: RecyclerView.OnScrollListener() {override fun onSc ...

  8. Android开发之recyclerview布局加载不全的问题

    先看图: 我明明写的是填充父布局怎么就只有这么窄呢? 看下我加载布局的方法: View fundView = View.inflate(parent.getContext(), R.layout.it ...

  9. Android开发之RecyclerView之刷新数据notifyDataSetChanged失败的问题

    今天做购物车,特别奇怪notifyDataSetChanged无论如何不能刷新数据. 代码如下: marketCartTvEditShop.setOnClickListener(v -> {// ...

最新文章

  1. 2017.4.7 e.toString() 与 e.getMessage()的区别
  2. Redis的常用命令——String的常用命令
  3. 批处理延时启动的几个方法
  4. 不冲突的端口范围_网络中IP地址发生冲突故障怎么办
  5. 怎样修改WIN7下的host文件
  6. ​选择云服务器的小窍门
  7. 移动电商营销吸睛法宝----图标、标签
  8. 【十九】文件译文:reportgenerator.properties (报表生成器属性文件)
  9. python中碰撞的代码_Python…Tkinter碰撞
  10. 【java学习之路】(javaWeb篇)001.HTML
  11. 联通手机卡欠费了无法转接人工服务?
  12. 现有Android项目引入ReactNative--九步大法
  13. 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
  14. python-Django 增删改和分页
  15. 32bit 天堂服务端假设教程
  16. 计算机专业就业方向小结
  17. c#通过ftp下载文件
  18. 中小企业OA管理系统(微鳄OA私有化部署)
  19. 短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离
  20. 直播电商购物消费者满意度在线调查报告(四)

热门文章

  1. 《c语言从入门到精通》看书笔记——第7章 循环控制
  2. 基于计算机的控制系统,基于计算机的机械控制系统实现方式研究.pdf
  3. mysql编辑前200行_巧妙使用SQL Server编辑前200行功能
  4. 项目交接文档_财务离职,交接工作需要交接哪些?附财务移交清册表!
  5. 使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小
  6. cookie读取中文时乱码
  7. Leetcode: Validate Binary Search Tree
  8. poj 3261 Milk Patterns 后缀数组 最长重复子串
  9. 图片与Byte相互转换,文件和字节流的转换方法
  10. C/C++中函数参数传递