package com.example.recyclerviewtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewActivity extends AppCompatActivity implements View.OnClickListener {
RecyclerView recyclerView;
Button btn_add;
Button btn_del;
Button btn_list;
Button btn_grid;
Button btn_flow;
List<String> datas;
private MyRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
initViews();
initdatas();
//设置adapter
adapter = new MyRecyclerViewAdapter(RecyclerViewActivity.this, datas);
recyclerView.setAdapter(adapter);
//设置分割线
recyclerView.addItemDecoration(new DividerListItemDecoration(RecyclerViewActivity.this, DividerListItemDecoration.HORIZONTAL_LIST));
recyclerView.addItemDecoration(new DividerListItemDecoration(RecyclerViewActivity.this, DividerListItemDecoration.VERTICAL_LIST));
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemclickListner() {
@Override
public void OnItemClick(View view, String data) {
Toast.makeText(RecyclerViewActivity.this, "data = " + data, Toast.LENGTH_SHORT).show();
}
});
//设置动画s
recyclerView.setItemAnimator(new DefaultItemAnimator());
}
private void initdatas() {
datas = new ArrayList<>();
for (int i = 0; i < 100; i++) {
datas.add("content_" + i);
}
}
@SuppressLint("WrongConstant")
private void initViews() {
btn_add = findViewById(R.id.btn_add);
btn_del = findViewById(R.id.btn_del);
btn_list = findViewById(R.id.btn_list);
btn_grid = findViewById(R.id.btn_grid);
btn_flow = findViewById(R.id.btn_flow);
btn_add.setOnClickListener(this);
btn_del.setOnClickListener(this);
btn_list.setOnClickListener(this);
btn_grid.setOnClickListener(this);
btn_flow.setOnClickListener(this);
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this, LinearLayoutManager.VERTICAL, false));
}
@SuppressLint("WrongConstant")
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_add:
adapter.addData(0, "zhangsan");
recyclerView.scrollToPosition(0);
break;
case R.id.btn_del:
adapter.removeData(0);
break;
case R.id.btn_list:
//设置LayoutManager
//最后一位代表时顺序还是倒序
recyclerView.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this, LinearLayoutManager.VERTICAL, false));
//recyclerView.scrollToPosition(datas.size()/2);//定位到中间位置
break;
case R.id.btn_grid:
//设置成3列
//最后一位代表时顺序还是倒序
recyclerView.setLayoutManager(new GridLayoutManager(RecyclerViewActivity.this, 3, GridLayoutManager.VERTICAL, false));
break;
case R.id.btn_flow:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
break;
}
}
}
定义Adapter
package com.example.recyclerviewtest;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context context;
private List<String> datas;
public MyRecyclerViewAdapter(Context context, List<String> datas) {
this.context = context;
this.datas = datas;
}
/**
* 相当于getView方法中船舰view和viewHodler
*
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = View.inflate(context, R.layout.item_layout, null);
return new MyViewHolder(itemView);
}
/**
* 相当于getview绑定数据的部分
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
//根据位置得到的数据
String data = datas.get(position);
holder.tv_text.setText(data);
}
@Override
public int getItemCount() {
return datas.size();
}
private OnItemclickListner ItemClickListener;
public void setOnItemClickListener(OnItemclickListner itemClickListener) {
this.ItemClickListener = itemClickListener;
}
public void addData(int position, String data) {
datas.add(position, data);
notifyItemInserted(position);
}
public void removeData(int i) {
if (datas.size() > 0) {
datas.remove(i);
notifyItemRemoved(i);
}
}
public interface OnItemclickListner {
void OnItemClick(View view, String data);
}
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView iv_icon;
private TextView tv_text;
public MyViewHolder(@NonNull final View itemView) {
super(itemView);
iv_icon = itemView.findViewById(R.id.iv_icon);
tv_text = itemView.findViewById(R.id.tv_text);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ItemClickListener != null) {
ItemClickListener.OnItemClick(itemView, datas.get(getLayoutPosition()));
}
}
});
}
}
}
设置分隔符 DividerListItemDecoration
package com.example.recyclerviewtest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class DividerListItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerListItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
// Log.e("recyclerview - itemdecoration", "onDraw()");
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
RecyclerView v = new RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
设置分割线xml文件
首先定义个drawable
divider_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:centerColor="#ff00ff00"
android:endColor="#ff0000ff"
android:startColor="#ffff0000"
android:type="linear" />
<size android:height="2dp" />
</shape>
设置style
<style name="listDividerTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:listDivider">@drawable/divider_bg</item>
</style>
AndroidManifest.xml中设置Activity的分割<activity android:name=".RecyclerViewActivity" android:theme="@style/listDividerTheme"></activity>