频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android之RecyclerView
2017-03-01 10:04:33         来源:轻风起自远东  
收藏   我要投稿

Android之RecyclerView。RecyclerView是比ListView更强大的滚动控件,他不仅仅能实现垂直滚动,还能实现横向滚动、瀑布分布等更复杂的效果。

由于RecyclerView不是系统SDK自带的空间,所欲需要在bulid.gradle中添加相应的依赖库,填加的语句是

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

注意不同的版本后面的编号是不一样的, 基本上和

compile 'com.android.support:appcompat-v7:25.1.1'

的编号一样就行了(v7:25.1.1)

完成后如下

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    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'
    //添加如下代码
    compile 'com.android.support:recyclerview-v7:25.1.1'

    testCompile 'junit:junit:4.12'
}

添加完后AndroidStudio会提醒你是否要Sync Now,点击Sync Now后就可以开始使用RecyclerView了

首先我们在activity_main.xml中添加RecyclerView控件,注意由于RecyclerView不是在系统内置SDK中的,因此需要把完整的包路径写出来




    

    

现在我们想要让RecyclerView完成和上一篇博客中ListView一样的效果,并为其添加点击布局的点击图片的监听事件(ListView只能为每一子项添加监听事件,这里就体现了RecyclerView的灵活性)。因此我们将Fruits实体类和为RecyclerView准备的布局文件fruit_item.xml复制过来,免去再写一样的代码。
接下来为RecyclerView准备适配器,新建FruitAdapter类,让其继承RecyclerView.Adapter,其中ViewHolder是我们在FruitAdapter类中定义的一个内部类,用来存放布局文件中的控件等

package com.studio.recyclerviewdemo;

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 android.widget.Toast;

import java.util.List;

/**
 * Created by xwx on 2017/2/28.
 */

public class FruitAdapter extends RecyclerView.Adapter
{

    //声明适配器的数据源
    private List mFruitList;

    //创建一个内部类ViewHolder并让其继承自RecyclerView.ViewHolder,用来缓存子项布局的控件等
    class ViewHolder extends RecyclerView.ViewHolder
    {
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;

        public ViewHolder(View itemView)//这个itemView通常就是RecyclerView子项的最外层布局
        {
            super(itemView);
            //获取RecyclerView子项最外层布局的控件
            fruitImage= (ImageView) itemView.findViewById(R.id.fruit_image);
            fruitName= (TextView) itemView.findViewById(R.id.fruit_name);
            //获取子项最外层布局实例
            fruitView=itemView;
        }
    }

    //适配器的构造方法,用于将要展示的数据源传进来
    public FruitAdapter(List fruitsList)
    {
        mFruitList=fruitsList;
    }

    //用来创建并返回ViewHolder实例的方法
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        final ViewHolder viewHolder=new ViewHolder(view);

        //为子项布局添加点击事件
        viewHolder.fruitView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //获取用户点击的子项的position
                int position=viewHolder.getAdapterPosition();
                Fruits fruits=mFruitList.get(position);
                Toast.makeText(v.getContext(),"you click view"+fruits.getName(),Toast.LENGTH_SHORT).show();
            }
        });

        //为子项图片添加点击事件
        viewHolder.fruitImage.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                int position=viewHolder.getAdapterPosition();
                Fruits fruits=mFruitList.get(position);
                Toast.makeText(v.getContext(),"you click image"+fruits.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        return viewHolder;
    }

    //用来对RecyclerView子项的数据进行赋值,在每个子项被滚动到屏幕内时被回调,这里的参数holder实际上就是上面onCreatViewHolder返回的ViewHolder
    @Override
    public void onBindViewHolder(ViewHolder holder, int position)
    {
        Fruits fruits=mFruitList.get(position);
        holder.fruitName.setText(fruits.getName().toString());
        holder.fruitImage.setImageResource(fruits.getImageId());
    }

    //用来告诉RecyclerView一共有多少子项
    @Override
    public int getItemCount()
    {
        return mFruitList.size();
    }


}

适配器准备完毕,接下来修改MainActivity中的Java代码

package com.studio.recyclerviewdemo;

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

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

public class MainActivity extends AppCompatActivity
{

    private List fruitsList=new ArrayList();
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();//初始化数据源中的数据
        RecyclerView recyclerView= (RecyclerView) findViewById(R.id.recycler_view);
        /*LayoutManager用于指定RecyclerView的布局,这里的LinearLayoutManager说明是线性布局,且默认为垂直排列*/
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        /*layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL)可以让RecyclerView布局变为水平,实现横向滚动*/
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter adapter=new FruitAdapter(fruitsList);
        recyclerView.setAdapter(adapter);
    }

    private void initFruits()
    {
        Fruits fruits=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits);
        Fruits fruits1=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits1);
        Fruits fruits2=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits2);
        Fruits fruits3=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits3);
        Fruits fruits4=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits4);
        Fruits fruits5=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits5);
        Fruits fruits6=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits6);
        Fruits fruits7=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits7);
        Fruits fruits8=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits8);
        Fruits fruits9=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits9);
        Fruits fruits10=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits10);
        Fruits fruits11=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits11);
        Fruits fruits12=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits12);
        Fruits fruits13=new Fruits("apple",R.mipmap.ic_launcher);
        fruitsList.add(fruits13);
    }
}

最终效果如下,点击了其中任意子项的布局或者图片就会弹出吐司
这里写图片描述

点击复制链接 与好友分享!回本站首页
上一篇:Android 面试题
下一篇:android:visibility和android:scaleType 属性
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站