安卓RecyclerView的用法

来源:互联网 发布:讨鬼传2捏脸数据女 编辑:程序博客网 时间:2024/05/17 01:36

ListView效率太低且只能够纵向滑动不能横向,若需要横向的话就需要用RecyclerView来实现,官方也推荐使用这种方式。

1.在app/build.gradle中加入依赖包

dependencies {    compile 'com.android.support:recyclerview-v7:25.3.1'}
然后点击Sync Now来自动下载相应的库。
模型类Fruit.java如下:
package com.example.wanglunhui.recyclerviewtest;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;    }}

activity_main.xml文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <android.support.v7.widget.RecyclerView        android:id="@+id/recycler_view"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>
每一个列表项显示的内容如下fruit_item.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="5dp" >    <ImageView        android:id="@+id/fruit_image"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/fruit_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:layout_marginTop="10dp" /></LinearLayout>


接下来需要为RecyclerView准备一个适配器,新建一个FruitAdapter继承自Recycler.Adapter并将泛型FruitAdapter.ViewHolder,
其中View是我们在FruitAdapter中定义的一个内部类。
package com.example.wanglunhui.recyclerviewtest;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;public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{//泛型为FruitAdapter.ViewHolder    private List<Fruit> mFruitList;    static class ViewHolder extends RecyclerView.ViewHolder {//ViewHolder为一个内部内,继承RecyclerView.ViewHolder        View fruitView;//用它来保存最外层布局的实例,它在onCreateViewHolder()时用它来对fruitImage和fruitName整体设置点击事件        ImageView fruitImage;        TextView fruitName;        public ViewHolder(View view) {//在ViewHolder内部类的构造函数中要传入一个View参数,这个参数通常是RecyclerView子项的最外层布局,
//那么我们就可以通过findViewById()方法来获取布局中的ImageView和TextView的实例了。            super(view);            fruitView = view;//保存最外层布局的实例            fruitImage = (ImageView) view.findViewById(R.id.fruit_image);//由参数view来获取实例            fruitName = (TextView) view.findViewById(R.id.fruit_name);//由参数view来获取实例        }    }    public FruitAdapter(List<Fruit> fruitList) {//构造函数,传入要展示的数据源,并保存下来再mFruitList中        mFruitList = fruitList;    }
    //因为FruitAdapter继承RecyclerView.Adapter,所以必须重写onCreateViewHolder()、onBindViewHolder()、和getItemCount()方法。    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//onCreateViewHolder()用于创建ViewHolder的实例,在这个方法中将R.layout.fruit_item加载进去做为每一项的布局。        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);        
final ViewHolder holder = new ViewHolder(view);//创建一个ViewHolder实例,并把加载的布局传入到构造函数中,为ViewHolder实例设置相应的事件,最后返回该实例。        
holder.fruitView.setOnClickListener(new View.OnClickListener() {//设置点击事件        @Override        public void onClick(View v) {            int position = holder.getAdapterPosition();//获取对应的内容            Fruit fruit = mFruitList.get(position);            Toast.makeText(v.getContext(), "you clicked view " + fruit.getName(), Toast.LENGTH_SHORT).show();        }    });    holder.fruitImage.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            int position = holder.getAdapterPosition();//获取对应的内容            Fruit fruit = mFruitList.get(position);            Toast.makeText(v.getContext(), "you clicked image " + fruit.getName(), Toast.LENGTH_SHORT).show();        }    });    return holder;//返回ViewHolder实例}
    
  @Override    
public void onBindViewHolder(ViewHolder holder, int position) {//onBindViewHolder()用于对RecyclerView子项的数据进行赋值的
//在每个子项被滑到屏幕内执行时,通过position获取当前Fruit实例,然后将数据设置到ViewHolder的ImageView和TextView中即可。
        Fruit fruit = mFruitList.get(position);        holder.fruitImage.setImageResource(fruit.getImageId());        holder.fruitName.setText(fruit.getName());    }    @Override    public int getItemCount() {//getItemCount()返回RecyclerView一共有多少子项,直接返回数据源的长度即可。        return mFruitList.size();    }}
MainActivity.java
package com.example.wanglunhui.recyclerviewtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import java.util.ArrayList;import java.util.List;import java.util.Random;public class MainActivity extends AppCompatActivity {    private List<Fruit> fruitList = new ArrayList<Fruit>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initFruits();        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//获取RecyclerView实例        LinearLayoutManager layoutManager = new LinearLayoutManager(this);//线性布局        recyclerView.setLayoutManager(layoutManager);        FruitAdapter adapter = new FruitAdapter(fruitList);//在Adapter的构造函数中传入数据源        recyclerView.setAdapter(adapter);    }    private void initFruits() {        for (int i = 0; i < 2; i++) {            Fruit apple = new Fruit("Apple", R.drawable.apple_pic);            fruitList.add(apple);            Fruit banana = new Fruit("Banana", R.drawable.banana_pic);            fruitList.add(banana);            Fruit orange = new Fruit("Orange", R.drawable.orange_pic);            fruitList.add(orange);            Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);            fruitList.add(watermelon);            Fruit pear = new Fruit("Pear", R.drawable.pear_pic);            fruitList.add(pear);            Fruit grape = new Fruit("Grape", R.drawable.grape_pic);            fruitList.add(grape);            Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);            fruitList.add(pineapple);            Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);            fruitList.add(strawberry);            Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);            fruitList.add(cherry);            Fruit mango = new Fruit("Mango", R.drawable.mango_pic);            fruitList.add(mango);        }    }}
运行结果如下:
当我们想要实现横向滚动的效果时,即不是默认的垂直滚动而是水平滚动:
   只需在LinearLayoutManager layoutManager = new
        LinearLayoutManager(this);
   的下面加上layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
   这句。
   但是运行的时候为水平显示,但只显示一个,如下
只显示一个,这是因为每一个列表子项是的布局是默认的水平Horizontal,并限制其宽度问100dp即可。所以应将列表子项文件fruit.xml改为如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="100dp"    android:layout_height="wrap_content"    android:layout_margin="5dp" >    <ImageView        android:id="@+id/fruit_image"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/fruit_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:layout_marginTop="10dp" /></LinearLayout>
运行结果为:
这样,RecyclerView即为横向滚动。
此外,我们还可以设置GridLayoutManager和StaggeredGridManager这两种布局排列方式,GridLayoutManager主要用于网格布局,用法为
GridLayoutManager layoutManager = new        GridLayoutManager(Context,3);//其中的3为每行显示的网格数目。
而StaggedGridManager为瀑布流布局,它展现的内容和GridlayoutManager类似,但是它的每一个项目可以占任意长度。
我们将fruit_item.xml改为如下
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"//将100dp改为match_parent是因为瀑布布局的宽度是根据布局的列数来决定的而不是一个固定值    android:layout_height="wrap_content"    android:layout_margin="5dp" >    <ImageView        android:id="@+id/fruit_image"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/fruit_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="left"//文字为左对齐,因为居中的话看起来不那么美观        android:layout_marginTop="10dp" /></LinearLayout>
MainActivity.java改为下
package com.example.wanglunhui.recyclerviewtest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import java.util.ArrayList;import java.util.List;import java.util.Random;public class MainActivity extends AppCompatActivity {    private List<Fruit> fruitList = new ArrayList<Fruit>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initFruits();        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);        StaggeredGridLayoutManager layoutManager = new//设置瀑布式布局                StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);//每行有3列,垂直滑动        recyclerView.setLayoutManager(layoutManager);        FruitAdapter adapter = new FruitAdapter(fruitList);        recyclerView.setAdapter(adapter);    }    private void initFruits() {        for (int i = 0; i < 2; i++) {
//下面的用getRandomLengthName()这个方法是为了对每一个项目的文本内容生成不同的长度,因为这样才可以体现出瀑布布局的随意性            Fruit apple = new Fruit(getRandomLengthName("Apple"), R.drawable.apple_pic);            fruitList.add(apple);            Fruit banana = new Fruit(getRandomLengthName("Banana"), R.drawable.banana_pic);            fruitList.add(banana);            Fruit orange = new Fruit(getRandomLengthName("Orange"), R.drawable.orange_pic);            fruitList.add(orange);            Fruit watermelon = new Fruit(getRandomLengthName("Watermelon"), R.drawable.watermelon_pic);            fruitList.add(watermelon);            Fruit pear = new Fruit(getRandomLengthName("Pear"), R.drawable.pear_pic);            fruitList.add(pear);            Fruit grape = new Fruit(getRandomLengthName("Grape"), R.drawable.grape_pic);            fruitList.add(grape);            Fruit pineapple = new Fruit(getRandomLengthName("Pineapple"), R.drawable.pineapple_pic);            fruitList.add(pineapple);            Fruit strawberry = new Fruit(getRandomLengthName("Strawberry"), R.drawable.strawberry_pic);            fruitList.add(strawberry);            Fruit cherry = new Fruit(getRandomLengthName("Cherry"), R.drawable.cherry_pic);            fruitList.add(cherry);            Fruit mango = new Fruit(getRandomLengthName("Mango"), R.drawable.mango_pic);            fruitList.add(mango);        }    }    private String getRandomLengthName(String name) {        Random random = new Random();        int length = random.nextInt(20) + 1;        StringBuilder builder = new StringBuilder();        for (int i = 0; i < length; i++) {            builder.append(name);        }        return builder.toString();    }}
运行结果如下:

原创粉丝点击