RecyclerView 的点击 添加 删除

本文介绍了一个基于RecyclerView的简单应用实例,展示了如何使用线性布局管理器、添加和删除项、设置适配器及响应点击事件等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MainActivity

package com.bwie.recyclerview_practice2;

import android.support.v7.app.AppCompatActivity;
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.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.bwie.recyclerview_practice2.adapter.DataAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerview;
    private List<String> lists;
    private Button bt_add;
    private Button bt_delete;
    private int pos = 1;
    private int posDel = 0;
    private DataAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();

        //线性布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        //设置方向**默认是垂直
        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        //给recyclerview设置布局管理器
        recyclerview.setLayoutManager(linearLayoutManager);
//        LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager, 与瀑布流对应的还有StaggeredGridLayoutManager等)
       /* GridLayoutManager(Context context, int spanCount)参数二:列数
       GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        recyclerview.setLayoutManager(gridLayoutManager);*/
        adapter = new DataAdapter(this, lists);
        //设置适配器
        recyclerview.setAdapter(adapter);
        //设置添加和删除item的动画__默认的动画
        recyclerview.setItemAnimator(new DefaultItemAnimator());
        //点击item的事件,注意是adapter 中的方法
        adapter.setOnItemClickListener(new DataAdapter.OnItemClickListener() {
            @Override
            public void onClick(int position) {
                Toast.makeText(MainActivity.this, "点击了item" + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(int position) {
                Toast.makeText(MainActivity.this, "长按了item" + position, Toast.LENGTH_SHORT).show();
            }
        });

        bt_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lists.add(pos, "item add " + pos);
                adapter.notifyItemInserted(pos);
                adapter.notifyItemRangeChanged(pos, lists.size());
                pos++;
            }
        });
        bt_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lists.remove(posDel);
                adapter.notifyItemRemoved(posDel);
                adapter.notifyItemChanged(posDel, lists.size());
            }
        });
    }

    private void initData() {
        lists = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            lists.add("item: " + i);
        }

    }

    private void initView() {
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        bt_add = (Button) findViewById(R.id.bt_add);
        bt_delete = (Button) findViewById(R.id.bt_delete);
    }


}

Adapter

 package com.bwie.recyclerview_practice2.adapter;

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.TextView;
import com.bwie.recyclerview_practice2.R;
import java.util.List;

/**
 * Created by zjj on 2016/11/12.
 */
//继承RecyclerView.Adapter<DataAdapter.MyViewHolder>
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder> {
    private final Context context;
    private final List<String> lists;
    OnItemClickListener mOnItemClickListener;
    public DataAdapter(Context context, List<String> lists) {
        this.context = context;
        this.lists = lists;
    }
    //1.定义一个接口:点击item事件
    public interface OnItemClickListener{
        void onClick( int position);
        void onLongClick( int position);
    }
    //2.设置set方法
    public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
        this. mOnItemClickListener=onItemClickListener;
    }
    /**
     *
     * @param parent
     * @param viewType
     * @return 将MyViewHolder返出去
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //最后一个参数是null,写成false 报非法状态异常
    //View view = View.inflate(context, R.layout.item, null);
        //.from(context) 为context加载布局.inflate()
        // 参数:inflate(int resource, ViewGroup root, boolean attachToRoot)

        View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        return new MyViewHolder(view);
    }

    /**
     * 给MyViewHolder 中的控件设置值
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.tv_content.setText(lists.get(position));
        //监听写在onBindViewHolder方法中
        //判断不为空
        if( mOnItemClickListener!= null){
            holder.tv_content.setOnClickListener( new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // 调用自定义点击方法
                    mOnItemClickListener.onClick(position);
                }
            });

            holder.tv_content.setOnLongClickListener( new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    //调用自定义长按方法
                    mOnItemClickListener.onLongClick(position);
                    return false;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return lists.size();
    }

// RecyclerView.ViewHolder 并有参构造
    class  MyViewHolder extends RecyclerView.ViewHolder{
//提成成员变量,否则外部调不到
    private final TextView tv_content;

    public MyViewHolder(View itemView) {
            super(itemView);
        tv_content = (TextView) itemView.findViewById(R.id.tv_content);
        }
    }

}

xml文件item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#000">

<TextView
    android:padding="5dp"
    android:layout_margin="1dp"
    android:background="#fff"
    android:textSize="20sp"
    android:text="text"
    android:gravity="center"
    android:id="@+id/tv_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

RecyclerView:注意事项

  • 设置布局管理器
  • 添加分割线
  • Adapter中写的监听事件(点击,长按)
  //分割线**listview中  divider height, DividerItemDecoration(Context context, int orientation) 
        recycleview.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
RecyclerView.Adapter中的刷新方法

 public final void notifyDataSetChanged()
 public final void notifyItemChanged(int position)
 public final void notifyItemRangeChanged(int positionStart, int itemCount)
 public final void notifyItemInserted(int position)
 public final void notifyItemMoved(int fromPosition, int toPosition)
 public final void notifyItemRangeInserted(int positionStart, int itemCount)
 public final void notifyItemRemoved(int position)
 public final void notifyItemRangeRemoved(int positionStart, int itemCount)

 notifyItemChanged(int position),当position位置的数据发生了改变时就会调用这个方法,就会回调对应position的onBindViewHolder()方法了,当然,因为ViewHolder是复用的,所以如果position在当前屏幕以外,也就不会回调了,因为没有意义,下次position滚动会当前屏幕以内的时候同样会调用onBindViewHolder()方法刷新数据了。其他的方法也是同样的道理。public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

 public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

 public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

 public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

 public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

DividerItemDecoration类

package com.bwie.recyclerview_practice;

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;

/**
 * Created by zjj on 2016/11/8.
 */
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);
        }

    }


    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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值