我们先看下效果图:
效果还是很不错的。
实现思路:
设置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!!!否则错误!!