Android之RecyclerView

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());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值