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);
}
}
最终效果如下,点击了其中任意子项的布局或者图片就会弹出吐司