RecyclerView增加和删除效果
来源:互联网 发布:网络最火的歌曲 编辑:程序博客网 时间:2024/04/28 18:57
RecyclerView增加和删除效果,不多说,代码中有注释
这里用到的是 * recy_view.setItemAnimator(new DefaultItemAnimator());
一、代码目录结构
二、MainActivity中代码
import android.app.Activity;import android.os.Bundle;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Button;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity implements View.OnClickListener{ private RecyclerView recy_view; private List<String> data; private ViewHoderAdaapters adaapters; private Button add_but,rm_but; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { add_but = (Button) findViewById(R.id.add_but); add_but.setOnClickListener(this); rm_but = (Button) findViewById(R.id.rm_but); rm_but.setOnClickListener(this); recy_view= (RecyclerView)findViewById(R.id.recy_view); //默认列表 GridLayoutManager LM = new GridLayoutManager(this,4); //横向滑动 recy_view.setLayoutManager(LM); recy_view.setItemAnimator(new DefaultItemAnimator()); //样式二,对应类DividerItemDecoration02 recy_view.addItemDecoration(new DividerItemDecoration02(this,LinearLayoutManager.HORIZONTAL,R.drawable.style02)); initData(); adaapters = new ViewHoderAdaapters(MainActivity.this,data); adaapters.setOnItemListener(new ViewHoderAdaapters.OnItemClickListener() { public void onLongClick(int position) { Toast.makeText(MainActivity.this,"您点击了第:"+position+"个Item",Toast.LENGTH_SHORT).show(); } public void onClick(int position) { Toast.makeText(MainActivity.this,"您点击了第:"+position+"个Item",Toast.LENGTH_SHORT).show(); } }); recy_view.setAdapter(adaapters); } private void initData() { data = new ArrayList<String>(); for (int i=0; i < 20; i++) { data.add("我是熊大"+i); } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.add_but: adaapters.addData(1); break; case R.id.rm_but: adaapters.removeData(1); break; } }}
三、适配器代码中代码
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.LinearLayout;import android.widget.TextView;import android.widget.Toast;import java.util.List;/** * Created by ENZ on 2016/10/15. */class ViewHoderAdaapters extends RecyclerView.Adapter { private Context context; private List<String> datas; private LayoutInflater inflater; private OnItemClickListener mOnItemClickListener; //构造方法 public ViewHoderAdaapters(MainActivity mainActivity, List<String> data) { this.context = mainActivity; this.datas = data; inflater = LayoutInflater.from(context); } //定义一个监听接口,里面有两个方法 public interface OnItemClickListener{ void onClick(int position); void onLongClick(int position); } //给监听设置一个构造函数,用于main中调用 public void setOnItemListener(OnItemClickListener mOnItemClickListener) { this.mOnItemClickListener = mOnItemClickListener; } @Override //重写onCreateViewHolder方法,返回一个自定义的ViewHolder public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.main_item,parent,false); ViewHoders viewHoders = new ViewHoders(view); return viewHoders; } @Override //填充onCreateViewHolder方法返回的holder中的控件 public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { ((ViewHoders) holder).tv.setText(datas.get(position)); if (mOnItemClickListener!=null) { //直接给某个空间添加监听 ((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); //直接给某个空间添加长按监听 ((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onLongClick(position); } }); } } @Override public int getItemCount() { return datas.size(); } //自定义ViewHolder, /* * RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了 * */ class ViewHoders extends RecyclerView.ViewHolder{ private TextView tv; private LinearLayout li_layout; public ViewHoders(View itemView) { super(itemView); tv= (TextView) itemView.findViewById(R.id.textview); li_layout= (LinearLayout) itemView.findViewById(R.id.li_layout); } } //添加一个增加item数据的方法,posion代表你从主类中传过来的值,这个值对应你添加的item在列表中的位置 public void addData(int position) { //保证列表没有数据时,首先添加 if(datas.size()==0){ datas.add(0, "我是熊大"); }else { //更新列表 datas.add(position, "我是熊大...."); notifyItemInserted(position); notifyItemRangeChanged(position,datas.size()); } } public void removeData(int position) { //保证列表有数据,并且最少有一条 if(datas.size()<2&&datas.size()!=0){ datas.remove(0); notifyDataSetChanged(); }else if(datas.size()==0){//当列表没有数据提示用户,免得造成系统崩溃 Toast.makeText(context,"搞毛啊,没数据了",Toast.LENGTH_SHORT).show(); }else{//更新列表 datas.remove(position); notifyDataSetChanged(); notifyItemRemoved(position); notifyItemRangeChanged(position,datas.size()); } }}
四、分割线代码
import android.content.Context;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created by ENZ on 2016/10/15. */public class DividerItemDecoration02 extends RecyclerView.ItemDecoration { //获取布局的方向 public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL = LinearLayoutManager.VERTICAL; //可以延长的 private Drawable mDivider; private int mOrientation; //方向的判断 private void setOrientation(int orientation) { if (orientation != HORIZONTAL && orientation != VERTICAL) { throw new IllegalArgumentException("你传递的方向参数好像有问题"); } //方向赋值给对象mOrientation; mOrientation = orientation; } /** * 自定义分割线 * * @param context * @param orientation 列表方向 * @param drawableId 分割线图片 */ public DividerItemDecoration02(Context context, int orientation, int drawableId) { mDivider = ContextCompat.getDrawable(context, drawableId); setOrientation(orientation); } //重写onDraw()方法。并且根据传递过来的方向来进行绘制分割线 @Override public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } /** * 绘制横向 item 分割线 * @param parent */ private void drawHorizontal(Canvas c, RecyclerView parent) { //左右的间距 ,left就是距离父类边界的距离,right同理 final int left = parent.getPaddingLeft()+10; final int right = parent.getWidth() - parent.getPaddingRight()-10; //获取item数据的长度 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.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } /** * 绘制纵向 item 分割线 * @param parent */ private void drawVertical(Canvas c, RecyclerView parent) { //左右的间距 ,top就是距离父类顶边界的距离,bottom是距离父类底部的边界距离 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); } } /* * 获取分割线尺寸 * getItemOffsets 中为 outRect 设置的4个方向的值,将被计算进所有 decoration 的尺寸中,而这个尺寸,被计入了 RecyclerView 每个 item view 的 padding 中 * */ public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL) { //在这个地方,我们才获取 outRect.set(0, 0, 0, mDivider.getIntrinsicWidth()); }else{ outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
五、布局和样式代码
- main布局
?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/add_but" android:layout_width="match_parent" android:layout_height="40dp" android:layout_weight="1" android:text="添加一条新数据"/> <Button android:id="@+id/rm_but" android:layout_width="match_parent" android:layout_height="40dp" android:layout_weight="1" android:text="删除一条新数据"/> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recy_view" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
- 效果图:
- item布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/li_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical"> <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="我是熊大"/> <ImageView android:id="@+id/imgview" android:layout_width="80dp" android:layout_gravity="center_horizontal" android:layout_height="60dp" android:background="@drawable/xiong01"/> </LinearLayout></LinearLayout>
效果图:
- 样式
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <!-- 填充的颜色 --> <solid android:color="#ED9800"/> <!-- 线条高度 --> <size android:height="5dp" android:width="1dp"/></shape>
六、demo:http://download.csdn.net/detail/bobo8945510/9658281
0 0
- RecyclerView增加和删除效果
- RecyclerView增加和删除效果
- RecyclerView 初次体验,实现增加删除条目及item长按和点击事件
- RecyclerView 获取条目中EditText的值, 增加条目和删除条目
- Android RecyclerView单点、批量数据元素项目item的增加、删除和移动
- RecyclerView的Item点击事件,增加删除Item瀑布流动画效果,长按拖动Item,RecyclerView复杂布局、实现新闻频道选择器
- [JavaScript]事件切换之-删除和恢复效果 + 表格增加行,删除行
- RecyclerView的拖拽 滑动删除效果
- 增加和删除
- 增加和删除列
- Android 在RecyclerView中实现拖拽和滑动删除的效果
- 详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- 详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- Android-详解RecyclerView+BGARefreshLayout实现自定义下拉刷新、上拉加载和侧滑删除效果
- RecyclerView的插入和删除
- RecyclerView的插入和删除
- RecyclerView实现条目展示 增加删除 3种管理器
- RecyclerView实现瀑布流、条目的增加、删除
- SSH的整合(转)
- 微信公众平台java开发详解(工程代码+解析)
- Git使用总结
- 【Android 开发入门】为按钮添加Click单击事件处理程序,显示/隐藏另一个按钮
- i春秋实验课时1--认识Wireshark的界面
- RecyclerView增加和删除效果
- PE 104 Pandigital Fibonacci ends (数学fibonacci)
- webservice开发二:使用CXF开发webservice
- Java 学习笔记
- ajax
- AIDL使用案例
- ListView设置setOnKeyListener后OnKey无法被调用的问题
- 3D建模系统blender快捷键
- Solr查询参数omitHeader