Android入门基础教程——RecycleView控件

ListView 可以说是android应用中使用得最多的控件之一,因为手机屏幕有限,但是我们想显示的内容是无限的,比如 QQ好友列表、控件留言板、今日头条新闻列表。。但是学过ListView应该都知道其的麻烦性,运行效率有多种提高途径,但是提高途径又不是每个人都能全部做到,所以android给我们提供了一个更强大的滚动控件RecycleView,这个控件在效率优化上已经达到很高的境界了(不说最高境界是因为更高更快更强),而且可以轻松实现横竖向滚动,以及给子项具体View实现点击事件
 
一、RecycleView 的使用方法
在上面也说了RecycleView是后期开发的,所以android为了让android每个版本 都能使用该控件便将RecycleView加在了support库当中而不是SDK中,所以我们要在bulid.gradle(spp)中添加依赖包。这里写图片描述
添加的方式有两种,这里就选 操作过程少的方式——代码方式介绍。
打开build.gradle,在dependencies 中添加
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support:recyclerview-v7:25.1.1'
}

代码填写完毕后点击这里写图片描述

然后就是在主xml中添加recycleView

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

因为RecycleView不是内置在系统SDK中的所以需要写全部的包名。

然后我们在创建一个子项布局。这里写图片描述
子项布局就是 这个图片中新闻列表中每个先问显示的布局,这个红线圈起来的布局就是简单的左边一个TextView,右边一个ImageView。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="120dp"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:id="@+id/item_img"/>
    <TextView
        android:text="TextView"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
         />
</LinearLayout>

然后我们再创建一个 Fruit 类

public class Fruit {
    private String name ;
    private int imageId ;

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}

和ListView一样 Adapter ,我们需要创建一个类Myadapter继承至Recycle.Adapter,我们知道适配器(adapter)是给容器(RecycleView、ListView)提供数据,而这些数据便是我们提供的所以为了统一数据类型使用泛型,并将泛型指定为 自己定义的适配器的内部类ViewHolder也就是

public class Myadapter extends RecyclerView.Adapter<Myadapter.ViewHolder> {
    private List<Fruit> fruits;
    private View ftuitView;

    public Myadapter(List<Fruit> fruits) {
        this.fruits = fruits;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView textView;

        public ViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.item_img);
            textView = (TextView) view.findViewById(R.id.textView);
        }
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        final ViewHolder viewHolder = new ViewHolder(view);
         return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Fruit fruit = fruits.get(position);
        holder.imageView.setImageResource(fruit.getImageId());
        holder.textView.setText(fruit.getName());
    }


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


}

大家是不是看到这么长的代码就觉得什么比ListView简单了,这么多代码也么见简单到哪去,大家仔细看看,看看这个适配器是不是思路很清晰,不想BaseAdapter一样麻烦。因为我们泛型指定为

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        final ViewHolder viewHolder = new ViewHolder(view);
         return viewHolder;
    }

通过inflater方法解析xml中的布局找到控件。
下面一个函数 onBindViewHolder(),一样的从名字是也能看出来是绑定ViewHolder,也可以想成设置信息。

public void onBindViewHolder(ViewHolder holder, int position) {
        Fruit fruit = fruits.get(position);
        holder.imageView.setImageResource(fruit.getImageId());
        holder.textView.setText(fruit.getName());
    }

最后一个函数getItemCount(),翻译过来就是 得到条目总数。

 public int getItemCount() {
        return fruits.size();
    }

我们条目的数量取决于我们 List fruits 的数目,数以我们直接返回 fruits.size()。

最后我们在进行MainActivity的代码修改

public class MainActivity extends AppCompatActivity {
    private List<Fruit> fruitList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruit();  //初始化数据,这是自定义的方法,请往后看
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyVew);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recycleView.setLayoutManager(layoutManager);
        Myadapter myadapter = new Myadapter(fruitList);
        recyclerView.setAdapter(myadapter);

    }

    private void initFruit () {
        Fruit fruit1 = new Fruit("apple",R.drawable.face3);
        fruitList.add(fruit1);
        Fruit fruit2 = new Fruit("apple",R.drawable.face13);
        fruitList.add(fruit2);
        Fruit fruit3 = new Fruit("apple",R.drawable.face14);
        fruitList.add(fruit3);
        Fruit fruit33 = new Fruit("apple",R.drawable.face15);
        fruitList.add(fruit33);
        Fruit fruit333 = new Fruit("apple",R.drawable.face14);
        fruitList.add(fruit333);

        Fruit fruit11 = new Fruit("apple",R.drawable.face13);
        fruitList.add(fruit11);
        Fruit fruit12 = new Fruit("apple",R.drawable.face12);
        fruitList.add(fruit12);
        Fruit fruit13 = new Fruit("apple",R.drawable.face11);
        fruitList.add(fruit13);
        Fruit fruit133 = new Fruit("apple",R.drawable.face10);
        fruitList.add(fruit133);
        Fruit fruit1333 = new Fruit("apple",R.drawable.face9);
        fruitList.add(fruit1333);
        Fruit fruit21 = new Fruit("apple",R.drawable.face8);
        fruitList.add(fruit21);
        Fruit fruit22 = new Fruit("apple",R.drawable.face8);
        fruitList.add(fruit22);
        Fruit fruit23 = new Fruit("apple",R.drawable.face7);
        fruitList.add(fruit23);
        Fruit fruit233 = new Fruit("apple",R.drawable.face6);
        fruitList.add(fruit233);
        Fruit fruit2333 = new Fruit("apple",R.drawable.face5);
        fruitList.add(fruit2333);

        Fruit fruit31 = new Fruit("apple",R.drawable.face3);
        fruitList.add(fruit31);
        Fruit fruit32 = new Fruit("apple",R.drawable.face12);
        fruitList.add(fruit32);
        Fruit fruit3333 = new Fruit("apple",R.drawable.face13);
        fruitList.add(fruit3333);
        Fruit fruit334 = new Fruit("apple",R.drawable.face14);
        fruitList.add(fruit334);
        Fruit fruit3334 = new Fruit("apple",R.drawable.face15);
        fruitList.add(fruit3334);

    }
}

我想这里只要有点ListView基础的朋友都能看懂,虽然我很想写的再详细一些让没有ListView基础的朋友也能看懂,但是这篇文件也写了好久了有点想草草结尾了,这里不是特别熟悉的朋友很难懂的应该就是
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recycleView.setLayoutManager(layoutManager);

这两行代码了吧, 就是因为多了这两行代码所以,RecycleView 备受欢迎,先解释一下这两行代码后面再说为什么因为这两行代码而备受欢迎。
因为RecycleView为了更简单的实现滚动方向的改变以及实现瀑布流,所以RecycleView的布局排列是由LayoutManager管理的,而不像ListView是自身管理的。
首先我们创建了一个LinearLayoutManager 对象 并传入context,我们这里创建的是线性布局管理器,然后我们再将这个不管理交给recycleView。所以就有了下面的代码recycleView.setLayoutManager(layoutManager);

现在说一下为什么recycleView因为这两行代码而备受欢迎,因为我们同过加一行代码就可以实现下面两种效果这里写图片描述这里写图片描述

有写的不对的地方还请大家见谅,写这篇文章主要是为了加深自己对RecycleView的理解,也是想能让更多和我刚学RecycleView时的朋友看到不一样的解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值