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中的,因此需要把完整的包路径写出来

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.studio.recyclerviewdemo.MainActivity">

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

    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

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

    //声明适配器的数据源
    private List<Fruits> 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<Fruits> 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<Fruits> fruitsList=new ArrayList<Fruits>();
    @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);
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,如果要进行RecyclerView的批量操作,可以通过以下几个步骤来实现。 首先,要创建一个自定义的RecyclerView适配器。在适配器中,我们可以添加一个boolean类型的数据成员,用于标记当前RecyclerView的批量操作状态。我们可以在适配器的构造方法中将该boolean类型的成员变量初始化为false。 其次,我们可以在RecyclerView的布局文件中添加一个全选的CheckBox。当用户点击全选CheckBox时,我们需要遍历RecyclerView的所有item并将其标记为选中状态,同时更新item对应的数据模型,使其选中状态为true。再次点击全选CheckBox时,我们需要取消所有item的选中状态。 然后,我们可以在RecyclerView的item布局文件中添加一个CheckBox来实现单个item的选中。我们可以通过监听CheckBox的点击事件,来更新item的选中状态,并刷新RecyclerView。 接下来,我们可以在RecyclerView的Activity或Fragment中创建一个菜单栏。在该菜单栏中,可以添加批量操作的选项,比如删除选中的item。当用户选择了批量操作的选项后,我们需要遍历RecyclerView的所有item,找到选中的item,并进行相应的批量操作。 最后,在RecyclerView适配器中增加一个方法,用来获取选中的item的位置。通过这个方法,我们可以获取选中的item的位置,进而获取选中的item的数据,并进行相应的批量操作。 通过以上的步骤,我们可以实现RecyclerView的批量操作,让用户能够方便地进行全选、取消全选、单个item选中和批量操作的功能。这样可以提高用户的使用体验,并方便用户进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值