RecyclerView使用初步



RecyclerView的介绍


今天我们呢继续学习安卓5.0及安卓5.1的新特性,今天我们要讲的recycleView。recycleView是谷歌在去年IO大会上新推出的用于取代ListView的控件,它的扩展性和灵活性,都是显著优于ListView的。为什么这么说呢?它的优点,我总结一下:第一是:它比较省内存,多个RecycleView可以共用ItemView。也就是说,如果我有一个应用,有多个类似的界面,这些界面里面所组成的ItemView都可以复用。是非常非常省内存的。那么,还有一点是布局灵活,它把布局方式和recycle本身的实现分隔开了,不像ListView。ListView我们都知道,它只能实现一个垂直的列表。那GridView也只能实现一个垂直滚动的格子视图。那如果是要横向滚动,它们就没有办法了。但是Recycle它可以,不管你是横着、竖着,或者是说有格子的,甚至是这种错位的(像瀑布流这种方式),实现起来也就是很快的事情。然后呢,它在里面内嵌了ViewHolder,ViewHolder通常我们在写ListView会接触到,它用于优化ListView性能。Recycle本身就提供了ViewHolder这样的一个机制。 那还有一点呢,我觉得是非常非常值得肯定的,在我们原来的ListVnet,当你的数据改变的时候(notifydatachanged让整个视图进行刷新),现在我们可以进行单个视图的刷新。那么,使用RecycleView难不难呢?其实不难,只要你有ListView的基础,RecycleView是很好实现的。



步骤


好,我们看一下,如果我们要使用RecycleView,那么我们需要哪些步骤。


1)第一点:我们要引入一个环境,我们都知道,RecycleView它不是安卓自带的。它是安卓 support v7包中的。所以说,我们需要在dependence这个方法体中加入compile这个RecycleView。


2)然后有了它之后,接下来我们定义ViewHolder,和ListView一样,一个ViewHolder其实就是View列表中的一个子项。它来决定了我们每一行视图的布局。


3) 然后我们接下来是Adapter,就相当于ListView的adapter,只是方法略有不同。


4)最后,我们要为它设置一个布局管理器,这个布局管理器就是我之前所说的。你是要垂直列表还是水平滚动列表还是格子列表等等。都是通过这个布局管理器来处理的,所以说,只要改变你的布局管理器,你的列表形态就完全不一样了。所以它使用上是非常非常灵活的。



代码实例


既然这么简单,那么我们还是看一下我们的代码。那么,首先我们看一下我们的gradle文件。


0.png


这就是我们的gradle文件:


1.png


大家注意啊,我的这个gradle文件是加了很多的依赖包。目前,我们只需要加这个RecycleView的依赖包就可以了。


2.png


加入它之后,我们之前说到了,我们接下来做的事情是什么呢?定义ViewHolder,于是乎,我就定义了我的一个ViewHolder。这就是我的ViewHolder:


3.png


源码


package com.win16.recyclerviewdemo;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.View;
import android.widget.TextView;
 
/**
 * Created by Rex on 11/5/2015.
 * blog.csdn.net/zoudifei
 * email:dfzou@live.com
 * powered by Win16.com
 */
public class MyViewHolder extends RecyclerView.ViewHolder{
 
    public TextView mTextView;
    public MyViewHolder(View itemView) {
        super(itemView);
        mTextView = (TextView) itemView.findViewById(android.R.id.text1);
    }
}


它实现的是RecycleView里面的ViewHolder。它有一个默认的构造函数,就是传一个View。这个ViewHolder就实现完了,通常我们会把我们这个每一个视图里面的一些View,通过findViewById给找出来。然后定义成成员变量,让它能够更加快速的寻找。 那这里要注意的是,通常我这里的View都定义成Public:可以直接去访问它,就不用get或者set这么麻烦了。


4.png


这里,我就赋值给TextView,注意我这里是复用的安卓系统的一个layout。所以我这里的id也是用android.R.id。


5.png


好,有了这个ViewHolder,接下来我们看一下绑定得非常紧密的adapter。adapter看起来稍微复杂一些:


package com.win16.recyclerviewdemo;
import android.content.pm.PackageInfo;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
 * Created by Rex on 11/5/2015.
 * blog.csdn.net/zoudifei
 * email:dfzou@live.com
 * powered by Win16.com
 */
public class MyAdatper extends RecyclerView.Adapter<MyViewHolder> {
 
    private List<PackageInfo> packageInfos;
 
    public MyAdatper(List<PackageInfo> packageInfos) {
        this.packageInfos = packageInfos;
    }
 
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        return new MyViewHolder(layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false));
    }
 
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        TextView textView = holder.mTextView;
        textView.setText(packageInfos.get(position).packageName);
 
    }
 
    @Override
    public int getItemCount() {
        return packageInfos.size();
    }
}


其实,它就重载了三个方法,好我们从头看。首先,它的基类也是RecycleView.Adapter。注意啊,这个是个泛型。所以说,我把之前的ViewHolder放进来。这里是需要是一个ViewHolder。


6.png


然后,我们申明了我的数据,同样的这里也有一个构造函数。这个构造函数呢,是传一个包的列表进来,给它赋值。


7.png


然后,这里有一个方法,叫onCreateViewHolder:这个onCreateViewHolder主要是创建一个View,并根据这个View创建一个ViewHolder出来。


8.png


好,这里实际上是写了两句话:第一句是:通过LayoutInflater找到LayoutInflater出来;然后是用这个LayoutInflater区inflater一个布局。到这里,这个就是我们的一个ItemView。然后,我这个ViewHolder的构造函数是一个View,于是乎我把它new出来:


9.png


可能细心的同学会问,在ListView中,我们有一个convertView,会通过它来判断,我这个View是不是能够复用,那这里为什么没有呢?请注意,这也是RecycleView的优势之一。也就是说,它已经内置了一个方法来做复用,所以说我们这里已经不用关注这个逻辑了。交给RecycleView本身来做。然后,接下来是绑定数据:onBindViewHolder,这个绑定数据,也就是说把你的数据和你的View给联系起来。|然后展示出来,非常的简单。


90.png


最后,是重写了getItemCount这个方法:这个就是返回你的个数类型。


91.png


接下来我们来看一下我们的MainActivity这个主Activity。


package com.win16.recyclerviewdemo;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SimpleItemAnimator;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.animation.LinearInterpolator;
import android.widget.Toast;
import java.util.List;
import jp.wasabeef.recyclerview.animators.FlipInBottomXAnimator;
import jp.wasabeef.recyclerview.animators.OvershootInLeftAnimator;
import jp.wasabeef.recyclerview.animators.SlideInDownAnimator;
import jp.wasabeef.recyclerview.animators.SlideInLeftAnimator;
import static android.support.v7.widget.RecyclerView.*;
public class MainActivity extends AppCompatActivity {
    private List<PackageInfo> packageInfoList;
    private MyAdatper adapter;
    private RecyclerView recyclerView;
    private Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                  setAction("Action", null).show();
            }
        });
 
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        packageInfoList = getPackageManager().getInstalledPackages(0);
        adapter = new MyAdatper(packageInfoList);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
//        recyclerView.setLayoutManager(new GridLayoutManager(this,2, GridLayoutManager.HORIZONTAL,false));
//        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
//        recyclerView.setItemAnimator(new SlideInLeftAnimator());
//        recyclerView.getItemAnimator().setAddDuration(1000);
//        recyclerView.getItemAnimator().setRemoveDuration(1000);
//        recyclerView.getItemAnimator().setMoveDuration(1000);
//        recyclerView.getItemAnimator().setChangeDuration(1000);
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST);
        recyclerView.addItemDecoration(dividerItemDecoration);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_add) {
            PackageInfo packageInfo = new PackageInfo();
            packageInfo.packageName = "com.win16.add";
            packageInfoList.add(0, packageInfo);
            adapter.notifyItemInserted(0);
            recyclerView.scrollToPosition(0);
        }
        else if (id == R.id.action_remove) {
 
            packageInfoList.remove(0);
            adapter.notifyItemRemoved(0);
        }
        else if (id == R.id.action_update) {
            packageInfoList.get(0).packageName = "com.win16.update";
            adapter.notifyItemChanged(0);
        }
        else {
            adapter.notifyDataSetChanged();
        }
        return super.onOptionsItemSelected(item);
    }
}


然后,我们把RecycleView这个找出来:


92.png


找出来之后,我这里是一个获取数据:是做的一个Demo,找本地的安装包。


93.png


然后,我们创建了一个adapter:


94.png


然后,把这个数据放到了adapter里面:


95.png


接着,我把这个adapter设到了这个RecycleView里面:


96.png


然后,最后我这里设了一个LayoutManager:大家注意啊,这个LayoutManager,我这里用了最简单的LinearLayouManager。于是它是线性的。


97.png


我们先运行一下程序给大家看一看,这里是我们后面会讲到的内容,先不用关心:


98.png


我们先运行一下。这就是我们运行出来的效果,这个RecycleView的效果和ListView是一样的。


99.png


这节课我们就讲到这里,那下节课我们会讲到RecycleView的一些属性,对它的一些配置。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

麦子大聚惠,豪华礼包你领了吗?

客服热线 400-862-8862

回到顶部