Android RecyclerView 获取数据实现添加,删除功能
来源:互联网 发布:大数据架构师 知乎 编辑:程序博客网 时间:2024/06/06 03:15
RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。
添加依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'compile 'com.android.support:mediarouter-v7:25.3.1'compile 'com.jakewharton:butterknife:7.0.1'
Just like ListView
- Activity的布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.qizu.recyclerview.MainActivity"> <LinearLayout android:id="@+id/LL" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:text="添加" android:onClick="add" android:id="@+id/adds" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="删除" android:id="@+id/deletes" android:onClick="delete" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:layout_below="@+id/LL" android:id="@+id/id_recyclerview" android:divider="#ff00ff" android:dividerHeight="10dp" android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>
- Item_home的布局文件
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="#44ff0000" android:layout_height="wrap_content"> <TextView android:id="@+id/id_num" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="1" /></FrameLayout>
- Activity
package com.qizu.recyclerview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.DividerItemDecoration;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> mDatas; HomeAdapter homeAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); //初始化数据 mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); //mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //设置LinearLayoutManager布局管理器 //mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));//设置GridLayoutManager布局管理器 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//设置StaggeredGridLayoutManager纵向布局管理器 //mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));//设置StaggeredGridLayoutManager横向布局管理器(修改item布局就可以控制大小) homeAdapter = new HomeAdapter(MainActivity.this, (ArrayList<String>) mDatas); mRecyclerView.setAdapter(homeAdapter); // 设置适配器 //mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); // 设置默认分割线 mRecyclerView.addItemDecoration(new com.qizu.recyclerview.DividerItemDecoration(this, com.qizu.recyclerview.DividerItemDecoration.HORIZONTAL_LIST));//自定义纵向分割线 mRecyclerView.addItemDecoration(new com.qizu.recyclerview.DividerItemDecoration(this, com.qizu.recyclerview.DividerItemDecoration.VERTICAL_LIST));// 自定义横向分割线 // 设置item动画 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //设置点击事件 (接口回调) homeAdapter.setOnItemClickLitener(new HomeAdapter.OnItemClickLitener() { @Override //点击吐司 public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, position + " click", Toast.LENGTH_SHORT).show(); } //长按吐司删除 @Override public void onItemLongClick(View view, int position) { Toast.makeText(MainActivity.this, position + " long click", Toast.LENGTH_SHORT).show(); homeAdapter.removeData(position); } }); } // 初始化数据 private void initData() { mDatas = new ArrayList<String>(); for (int i = 0; i < 101; i++) { mDatas.add("Zhangren" + i); } } //添加 public void add(View v){ homeAdapter.addData(1); } //删除 public void delete(View v){ homeAdapter.removeData(1); }}
HomeAdapter
package com.qizu.recyclerview;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { private Context context; private List<Integer> datas; private ArrayList<String> mDatas; private OnItemClickLitener mOnItemClickLitener; // 监听 /*item的点击事件的长按事件接口*/ private AdapterView.OnItemClickListener onItemClickListener; /*瀑布流时的item随机高度*/ private List<Integer> heights = new ArrayList<>(); /*不同的类型设置item不同的高度*/ private int type = 0; public HomeAdapter(Context context, List<Integer> datas) { this.context = context; this.datas = datas; for (int i : datas) { int height = (int) (Math.random() * 100 + 300); heights.add(height); } } public void setType(int type) { this.type = type; } /** * 设置点击事件 * * @param onItemClickListener */ //定义接口 public interface OnItemClickLitener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; } //构造方法 public HomeAdapter(Context context, ArrayList<String> mDatas) { this.context = context; this.mDatas = mDatas; } // 实例化 Holder @Override public HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_home, parent, false)); return holder; } //绑定holder 在onBindHolder中 设置数据 @Override public void onBindViewHolder(final HomeAdapter.MyViewHolder holder, int position) { holder.tv.setText(mDatas.get(position)); // 如果设置了回调,则设置点击事件 if (mOnItemClickLitener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemLongClick(holder.itemView, pos); return false; } }); } } // 总条数 @Override public int getItemCount() { return mDatas.size(); } // 在 holder中 找到控件 public class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.id_num); } } /** * 设置item监听的接口 */ public interface OnItemClickListener { void onItemClickListener(int position, Integer data); } //添加更新数据 public void addData(int position) { mDatas.add(position, "Zhangren"); notifyItemInserted(position); } //删除更新数据 public void removeData(int position) { mDatas.remove(position); notifyItemRemoved(position); }}
ItemDecoration
我们可以通过该方法添加分割线: mRecyclerView.addItemDecoration()
该类参考自:DividerItemDecoration
package com.qizu.recyclerview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;public class DividerItemDecoration 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 DividerItemDecoration(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.v("recyclerview - itemdecoration", "onDraw()"); if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } /** * 绘制纵向列表时的分隔线 这时分隔线是横着的 * 每次 left相同,top根据child变化,right相同,bottom也变化 * @param c * @param 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); } } /** * 绘制横向列表时的分隔线 这时分隔线是竖着的 * l、r 变化; t、b 不变 * @param c * @param parent */ 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); } }}
该分割线是系统默认的,你可以在theme.xml中找到该属性的使用情况。那么,使用系统的listDivider有什么好处呢?就是方便我们去随意的改变,该属性我们可以直接声明在:
- 1
- 2
- 3
- 4
然后自己写个drawable即可,下面我们换一种分隔符:
我们尝试去实现类似GridView,秒秒钟的事情:
- 1
- 2
DividerGridItemDecoration
。package com.qizu.recyclerview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.LayoutManager;import android.support.v7.widget.RecyclerView.State;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{ private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { 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.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawVertical(Canvas c, RecyclerView parent) { 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 top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos >= childCount) return true; } else // StaggeredGridLayoutManager 且横向滚动 { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部 { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边 { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } }}
Hongyang
大神的博客出处: http://blog.csdn.net/lmj623565791/article/details/45059587;
阅读全文
0 0
- Android RecyclerView 获取数据实现添加,删除功能
- Android-RecyclerView实现Item添加和删除
- 实现datagridview中数据的添加,更改,删除功能
- android recyclerview 删除和添加 bug
- recyclerView三种管理器和删除添加功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android中Recyclerview使用2----实现添加删除条目时加动画
- Android 添加数据到RecyclerView的顶部
- RecyclerView 添加删除
- RecyclerView添加删除
- android网络数据获取与解析+RecyclerView数据展示实现ListView、GridView、瀑布流切换
- Android RecyclerView实现下拉列表功能
- Android-RecyclerView实现购物车简单功能
- 使可变性最小化。
- git撤销操作(git checkout; git reset)
- maven导入jar包报错解决办法之一
- Hashmap的容量为什么是2的幂次
- matlabday01
- Android RecyclerView 获取数据实现添加,删除功能
- 链栈实现
- 获得WINDOWS下所有用户的信息
- 欢迎使用CSDN-markdown编辑器
- Fortran几个函数(DOT_PRODUCT+MATMUL+TRANSPOSE+RESHAPE)
- angularJS商品表格
- spring中各个类的作用
- 欢迎使用CSDN-markdown编辑器
- String、StringBuffer与StringBuilder之间区别