RecyclerView

RecyclerView

RecyclerView的基本用法

添加recyclerView

现在activity_main.xml中添加一个recyclerView。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

创建适配器

在之前的ListView中为了提高效率使用了ViewHolder,在recyclerView中自带了ViewHolder.我们只需要根据这个ViewHolder来重写我们自己的ViewHolder就好。

class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
    List<Fruit> fruits;
    //构造方法引入数据
    FruitAdapter(List<Fruit> fruits){
        this.fruits=fruits;
    }
    @NonNull
    @Override
    //创建ViewHolder
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        return new ViewHolder(view);
    }
    @Override
    //为子项绑定数据
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Fruit fruit=fruits.get(position);
        holder.textView.setText(fruit.getName());
        holder.imageView.setImageResource(fruit.getId());
    }

    @Override
    //得到子项的数量
    public int getItemCount() {
        return fruits.size();
    }
    //自定义ViewHolder
    class ViewHolder extends RecyclerView.ViewHolder{
        ImageView imageView;
        TextView textView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            this.imageView=itemView.findViewById(R.id.image_view);
            this.textView=itemView.findViewById(R.id.image_name);
        }
    }
}

为recyclerView绑定适配器和设置布局。

为recyclerView设置为线性布局,并绑定适配器。

FruitAdapter fruitAdapter=new FruitAdapter(fruitList);
        RecyclerView recyclerView=findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(fruitAdapter);

RecyclerView实现横向滚动

修改子项布局

修改成垂直方向放置

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:orientation="vertical"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        />
    <TextView
        android:id="@+id/image_name"
        android:layout_width="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_height="wrap_content"
        />
</LinearLayout>

修改RecyclerView的放置顺序

将RecyclerView的放置顺序由垂直变成水平,
即修改布局管理器(LinearLayoutManager)的排列方式。

       FruitAdapter fruitAdapter=new FruitAdapter(fruitList);
        RecyclerView recyclerView=findViewById(R.id.recycler_view);
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(fruitAdapter);

RecyclerView相比ListView的优点

recyclerView相比ListView为我们提供了许多的布局管理器,如LinearLayoutManager和GridLayoutManager和StaggeredGridLayoutManager(瀑布流布局)。通过这些布局管理器可以实现很多ListView无法实现的效果。

RecyclerView实现瀑布流布局

修改xml文件

同样的也是要先修改子项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_margin="5dp"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        />
    <TextView
        android:id="@+id/image_name"
        android:layout_width="wrap_content"
        android:layout_gravity="left"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        />
</LinearLayout>

修改Activity

将文字数据扩长

原先数据只有一个名字,太短,不适合瀑布流布局的体现。所以写一个getRandomLengthName的方法将文字扩长。

    private String getRandLengthName(String Name) {
        Random random=new Random();
        int length=random.nextInt(20)+1;
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0; i<length; i++){
            stringBuilder.append(Name);
        }
        return stringBuilder.toString();
    }

将布局改成瀑布流布局

        FruitAdapter fruitAdapter=new FruitAdapter(fruitList);
        RecyclerView recyclerView=findViewById(R.id.recycler_view);
        StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        recyclerView.setAdapter(fruitAdapter);

RecyclerView的点击事件

RecyclerView中的data是放在ViewHolder里的,于是只需要在创建ViewHolder时为其数据进行绑定就行。

ViewHolder viewHolder=new ViewHolder(view);
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position=viewHolder.getAdapterPosition();
                Fruit fruit=fruits.get(position);
                Toast.makeText(v.getContext(),"you click the view "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        viewHolder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position=viewHolder.getAdapterPosition();
                Fruit fruit=fruits.get(position);
                Toast.makeText(v.getContext(),"you click the image "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
上一篇:c++11: trailing return type in functions(函数返回类型后置)


下一篇:基于Django+Pyecharts的COVID19新冠肺炎疫情监控面板