我们先看下效果图:

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

效果还是很不错的。

实现思路:

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

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

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

  @Override
    public 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;
    }

    @Override
    public 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;

    @Override
    protected 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() {
            @Override
            public void onAddDataListener(int position) {
                i++;
                addViewed.add("【下一页5】" + i);
                addDataAdapter.notifyDataSetChanged();
            }
        });
        addDataAdapter.setLongClickListenerRemove(new AddDataAdapter.longClickListenerRemove() {
            @Override
            public 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
    @Override
    public 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);
        }
    }

    @Override
    public 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() {
                @Override
                public boolean onLongClick(View v) {
                    longClickListenerRemove.setLongClickListener(v);
                    return true;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return addViewed.size() + 1;
    }

    @Override
    public 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() {
                    @Override
                    public 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.RecyclerView
        android: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!!!否则错误!!

相关文章: