关于RecyclerView布局

看完有点蒙,就自己再梳理一下。

一、纵向滚动

  1. 配置依赖
implementation 'androidx.recyclerview:recyclerview:1.0.0'
  1. 配置主活动界面activity_main.xmlrecyclerview
<?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" >

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </androidx.recyclerview.widget.RecyclerView>

</LinearLayout>
  1. 新建Fruit
package com.example.recycleview;

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;
    }

}
  1. 新建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" >

    <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_marginLeft="10dp"
        />


</LinearLayout>
  1. 准备适配器(没怎么看懂的地方,T_T)

1)新建FruitAdapter
2)定义一个内部类viewholder,通过findViewById来获取image和text。该类继承自recyclerView.ViewHolder。其下构造函数需要传入一个view参数,通常是子项的最外层布局,可能相当于一个大容器??

static class ViewHolder extends RecyclerView.ViewHolder{
    ImageView fruitImage;
    TextView fruitName;
    public ViewHolder(View view){
        super(view);
        fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
        fruitName = (TextView) view.findViewById(R.id.fruit_name);
    }
}

3)FruitAdapter自己本身也有一个构造函数,用来传入数据。后续的操作都这全局变量mFruitList上执行。

public FruitAdapter(List<Fruit> fruitList){
    mFruitList = fruitList;
}

4)继承自RecycleView.Adapter,必须重写三个方法:
onCreateViewHolder:加载fruit.xml布局,把加载的实例传入构造函数中,并返回。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_fruit_item, parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

onBindViewHolder:对子项数据(name和image)绑定,在子项执行滚动到屏幕内时执行。position用来获取当前的实例

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Fruit fruit= mFruitList.get(position);
    holder.fruitImage.setImageResource(fruit.getImageId());
    holder.fruitName.setText(fruit.getName());
}

getItemCount
顾名思义,告诉返回有多少个子项

  1. 开始使用recyclerView
    ①在onCreate中定义一个初始化Fruit方法
  //初始化水果数据
        initFruits();

该方法具体的实现(我觉得这有点繁琐,以后学会来看看能不能用对象来实现)

private void initFruits() {
    for (int i = 0;i <2; i++){
        Fruit apple = new Fruit("Apple",R.drawable.ic_launcher_background);
        fruitList.add(apple);
        Fruit banana = new Fruit("banana",R.drawable.ic_launcher_foreground);
        fruitList.add(banana );
        Fruit orange = new Fruit("orange",R.drawable.ic_launcher_background);
        fruitList.add(orange );
        Fruit watermelon = new Fruit("watermelon",R.drawable.ic_launcher_background);
        fruitList.add(watermelon );
        Fruit pear = new Fruit("pear",R.drawable.ic_launcher_background);
        fruitList.add(pear );
        Fruit grape = new Fruit("grape",R.drawable.ic_launcher_background);
        fruitList.add(grape );
        Fruit pineapple = new Fruit("pineapple",R.drawable.ic_launcher_background);
        fruitList.add(pineapple );
        Fruit strawberry = new Fruit("strawberry",R.drawable.ic_launcher_background);
        fruitList.add(strawberry );
        Fruit cherry = new Fruit("cherry",R.drawable.ic_launcher_background);
        fruitList.add(cherry );
        Fruit mango = new Fruit("mango",R.drawable.ic_launcher_background);
        fruitList.add(mango );
    }
}

②再回到onCreate中, 先获取Recyclerview实例。后边你要使用这个实例,总得知道他在哪里对吧。

 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycle_view);

③再创建一个LinearLayoutManager对象来指定布局的方式为线性布局,并设置到recyclerview中。

 LinearLayoutManager layoutManager =  new LinearLayoutManager(this);
 recyclerView.setLayoutManager(layoutManager);

④创建FruitAdapter实例,把水果数据传入适配器

FruitAdapter adapter = new FruitAdapter(fruitList);

⑤调用setAdapter方法来完成适配器设置

   recyclerView.setAdapter(adapter);

以上就实现纵向滚动辣
横向滚动和瀑布流待我看了再来写!!

二、横向滚动

由于ListView是通过自身去实现横向滑动,而RecycleView是交给LayoutManager实现这一步骤的,其有一套可扩展的布局排列接口。

  1. 设置fruit.xml中界面垂直布局,且固定宽度
android:layout_width="100dp"
android:layout_height="wrap_content" 
  1. 在main_activity中设置设置横向布局
layoutManager.setOrientation( LinearLayoutManager.HORIZONTAL);

三、瀑布流布局

  1. 修改fruit.xml,主要修改了单个组合的宽度
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    //设置自己匹配
    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"
        android:layout_gravity="center_horizontal"
        />
    <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>
  1. 修改main_activity,也就一行代码,直接用瀑布流布局就好了
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
  1. 为了让效果更加明显,随机产生文字数
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();
}

引入循环写入数据的时候用户使用getRandomLengthName方法

  Fruit apple = new Fruit(getRandomLengthName("apple"),R.drawable.ic_launcher_background);
            fruitList.add(apple);

最终瀑布流效果图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值