RecyclerView是support:recyclerview-v7中提供的控件,最低兼容到android 3.0版本。
官方介绍RecyclerView为在有限的窗口展现大量数据的控件。拥有类似功能的控件有ListView、GridView以及被Google遗弃的Gallery等,为毛已经有了它们,Google还推出RecyclerView呢,那就要说说RecyclerView所具有的一些优势了。
那RecyclerView到底有啥优势呢?总结起来六颗字:低耦合高类聚。RecyclerView已经标准化ViewHolder,我们自定义的ViewHoler需要继承 RecyclerView.ViewHolder,然后在构造方法中初始化控件,后面会有具体介绍。通过设置不同的LayoutManager,以及结合ItemDecoration , ItemAnimator,ItemTouchHelper,可以实现非常炫酷的效果,这些是ListView等控件难以企及的。
基本使用:
1.使用前需要在在gradle中添加依赖或者快捷键ctrl+alt+shift+s应用最后一项添加
implementation 'com.android.support:recyclerview-v7:27.0.2'
2.编写代码,首先我们需要在Xml中写RecyclerView的布局,
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后在activity中获取RecyclerView,并设置LayoutManager以及adapter
//去掉标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//让窗体全屏,达到适配
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
//强制横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_main);
rlv = findViewById(R.id.recyclerView);
/**
* 设置布局:
* 第一个参数:上下文
* 第二参数:方向
* 第三个参数:排序低到高还是高到低显示, false是低到高显示
*
*/
//垂直型
rlv.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
//网格型
// rlv.setLayoutManager(new GridLayoutManager(MainActivity.this,3));
//瀑布型
// rlv.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
rlv.setHasFixedSize(true);
//假数据
initdata();
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mdata);
//设置数据适配器显示数据
rlv.setAdapter(adapter);
}
private void initdata() {
mdata = new ArrayList();
for (int i = 0; i < 50; i++) {
mdata.add(i, i + 1 + "");
}
}
接下来在RecyclerViewAdapter中设置数据适配器
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private Context context;
private List mdatal;
public RecyclerViewAdapter(Context context, List mdatal) {
this.context = context;
this.mdatal = mdatal;
}
// 创建新View,被LayoutManager所调用
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
// 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);
// 创建一个ViewHolder
ViewHolder holder = new ViewHolder(view);
return holder;
}
// 将数据与界面进行绑定的操作
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
String name = (String) mdatal.get(i);
viewHolder.title_tv.setText("Title "+name);
viewHolder.content_tv.setText("Content "+name);
// int padding = Math.abs(new Random().nextInt() % 50);
// viewHolder.title_tv.setPadding(0, padding, 0, 0);
// viewHolder.content_tv.setPadding(0, 0, 0, padding);
}
// 获取数据的数量
@Override
public int getItemCount() {
return mdatal == null? 0:mdatal.size();
}
// 自定义的ViewHolder,持有每个Item的的所有界面组件
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title_tv;
public TextView content_tv;
public ViewHolder(@NonNull View itemView) {
super(itemView);
title_tv = itemView.findViewById(R.id.title_tv);
content_tv = itemView.findViewById(R.id.content_tv);
}
}
}
recyclerview_item布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:padding="6dp"
android:background="#fff"
android:layout_marginBottom="5dp"
>
<ImageView
android:id="@+id/icon_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="6dp"
android:contentDescription="null"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/title_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon_img"
android:layout_alignParentTop="true"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:text="Title"
android:textSize="16sp" />
<TextView
android:id="@+id/content_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon_img"
android:layout_alignParentRight="true"
android:layout_below="@id/title_tv"
android:layout_marginTop="5dp"
android:text="content"
android:textSize="12sp" />
</RelativeLayout>
[点击并拖拽以移动]
效果图:
还可以设置分割线:
代码是借鉴网上的
//设置分割线-分割线需要自定义&还可以自定义分割线的样式
//没有提供默认的分割线
recyclerview.addItemDecoration(new DividerListItemDecoration(this, DividerListItemDecoration.VERTICAL_LIST ));
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);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.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);
自定义设置item的点击事件或者item中某个控件的点击事件
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private final Context context;
private final ArrayList<String> datas;
//设置点击某个item的监听
public interface OnItemClickListener{
void onItemClick(View view,int position,String content);
}
private OnItemClickListener onItemClickListener;
/**
* 设置某条的监听
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
//设置点击图片
//设置点击某个item的监听
public interface OnImageViewClickListener{
void onImageViewClick(View view,int position);
}
private OnImageViewClickListener onImageViewClickListener;
/**
* 设置监听图片
* @param onImageViewClickListener
*/
public void setOnImageViewClickListener(OnImageViewClickListener onImageViewClickListener) {
this.onImageViewClickListener = onImageViewClickListener;
}
...................................
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv_text;
private ImageView iv_icon;
public MyViewHolder(View itemView) {
super(itemView);
tv_text = (TextView) itemView.findViewById(R.id.tv_text);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
//设置点击事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onItemClickListener != null){
onItemClickListener.onItemClick(v,getLayoutPosition(),datas.get(getLayoutPosition()));
}
}
});
//设置监听
iv_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onImageViewClickListener != null){
onImageViewClickListener.onImageViewClick(v,getLayoutPosition());
}
}
});
}
}
}
在Activity中使用自定义的点击事件
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position, String content) {
Toast.makeText(RecyclerViewActivity. this, "content==" +content+",--position=="+position, Toast.LENGTH_SHORT ).show();
}
});
---------------------
本文来自 苏打水解渴 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/baidu_31956557/article/details/51908346?utm_source=copy
删除和增加数据
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
........................
/**
* 添加数据
* @param position
* @param content
*/
public void addData(int position,String content){
datas.add(position,content);
notifyItemInserted(position);
}
/**
* 移除数据
* @param position
*/
public void removeData(int position){
datas.remove(position);
notifyItemRemoved(position);
}
}
---------------------
本文来自 苏打水解渴 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/baidu_31956557/article/details/51908346?utm_source=copy
设置删除某条和增加某条的动画
recyclerview.setItemAnimator(new DefaultItemAnimator());