Android RecyclerView(二)RecyclerView的使用

版权声明:转载请说明出处 https://blog.csdn.net/qq_41816123/article/details/86081841

1.学完这章你会对RecyclerView有个基本的了解

1.在app目录下的build.gradle导入

compile 'com.android.support:recyclerview-v7:23.4.0'

虽然之后会有红色提示
在这里插入图片描述
但是没有关系

2.在main_activity.xml文件中添加RecyclerView控件,再给个id

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rv_user"
    >
</android.support.v7.widget.RecyclerView>

3.创建我们的item_user

<?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:layout_margin="10dp"
    >
    <ImageView
        android:id="@+id/iv_user_img"
        android:src="@drawable/tx"
        android:layout_width="60dp"
        android:layout_height="60dp" />
    <TextView
        android:background="#9aa1ff"
        android:textColor="#ffffff"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_weight="1"
        android:text="小老弟"
        android:id="@+id/tv_user_name"
        android:layout_width="0dp"
        android:layout_height="60dp" />
</LinearLayout>

4.创建User.class

package com.yuexia.recyclerview;

/**
 * Created by syt98 on 2019/1/8.
 */

public class User {
    private int img;
    private String name;

    public User(int img, String name) {
        this.img = img;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImg() {
        return img;
    }

    public void setImg(int img) {
        this.img = img;
    }
}

5.创建适配器MyAdapter.class
这里需要继承 RecyclerView.Adapter,以及实现三个方法

package com.yuexia.recyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by syt98 on 2019/1/8.
 */

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH>{
    private List<User> users;
    
    //创建构造方法获取数据
    public MyAdapter(List<User> users){
        this.users=users;
    }
    
    public static class VH extends RecyclerView.ViewHolder{
        public final ImageView img;
        public final TextView name;
        public VH(View itemView) {
            super(itemView);
            //获取控件
            img=(ImageView)itemView.findViewById(R.id.iv_user_img);
            name=(TextView)itemView.findViewById(R.id.tv_user_name);
        }
    }
    
    @Override
    public MyAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {
        //创建视图
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user,parent,false);
        return new VH(v);
    }

    @Override
    public void onBindViewHolder(MyAdapter.VH holder, int position) {
        //为视图添加属性
        holder.img.setImageResource(users.get(position).getImg());
        holder.name.setText(users.get(position).getName());
        //为条目添加点击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //编写事件
            }
        });
        //为条目子控件添加事件
        holder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //编写事件
            }
        });
    }

    @Override
    public int getItemCount() {
        //返回数组长度
        return users.size();
    }
}

6.编写我们的MainActivity.class,写两个方法一个用来加载视图,一个用来加载数据

package com.yuexia.recyclerview;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;

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

public class MainActivity extends AppCompatActivity {
    private List<User> users=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();

    }

    private void initData() {
        users.add(new User(R.drawable.tx,"小虎"));
        users.add(new User(R.drawable.tx0,"胖虎"));
        users.add(new User(R.drawable.tx0,"小新"));
        users.add(new User(R.drawable.tx,"蜡笔"));
        users.add(new User(R.drawable.tx0,"浪漫"));
        users.add(new User(R.drawable.tx,"小虎"));
        users.add(new User(R.drawable.tx0,"胖虎"));
        users.add(new User(R.drawable.tx0,"小新"));
        users.add(new User(R.drawable.tx,"蜡笔"));
        users.add(new User(R.drawable.tx0,"浪漫"));
    }

    private void initView() {
        //获取控件
        RecyclerView recyclerView= (RecyclerView)this.findViewById(R.id.rv_user);
        //创建线性布局管理器
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        //设置为垂直布局
        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        recyclerView.setAdapter(new MyAdapter(users));

        //设置分隔线
//        recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
        //设置增加或删除条目的动画
//        recyclerView.setItemAnimator( new DefaultItemAnimator());

    }
}

7.效果图
在这里插入图片描述

是不是完成了ListView的功能,大家又要问了,既然ListView也能完成比这还简单,为什么还用RecyclerView呢?接下来我们看看ListView无法实现的功能 水平布局 网格布局 瀑布式布局 的代码

//设置水平布局
linearLayoutManager.setOrientation(OrientationHelper.HORIZONTAL);
//设置网格布局管理器每行3个Item
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, OrientationHelper.VERTICAL, false);
//设置瀑布式布局管理器每行3个Item
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL);

总结

1.Recycler View是强制你创建ViewHolder的,这样可以优化性能
2.也是可以实现水平布局和瀑布式布局的利器
后续我会讲解万能适配器让你对RecyclerView使用的更方便。

猜你喜欢

转载自blog.csdn.net/qq_41816123/article/details/86081841