最强大的滚动控件————RecyclerView

首先先接受另外一个相似的滚动控件的ListView ----

的的ListView控件的局限性:

需要使用一些技巧来提升它的运行效率,否则性能会非常差;

 的ListView的控件中的只能实现纵向滚动,不能实现横向滚动,以及网格和瀑布流布局;

 

实现一个简单的商铺的外卖演示:

1.RecyclerView定义在支持库中,首先需要在项目的的的的的build.gradle中添加依赖库(方法之一):

依赖{    

实现fileTree(包括:['* .jar'],dir:'libs')    

实现 'com.android.support:appcompat-v7:27.1.1'    

实现 'com.android.support:recyclerview-v7:27.1.1'

}

2.首先理清设计的思路:

(1)编写RV所在活动的布局文件

(2)编写条目(项目)布局文件

(3)编写条目所用数据的实体类

(4)定义适配器(适配器)类

(5)编写RV所在活动


3.代码展示(核心部分)

(1)编写RV所在活动的布局文

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

效果如图:

(2)编写条目(项目)布局文件

(按需设计布局文件)效果如下:

(3)编写条目所用数据的实体类

这里存放的是需要显示的基础数据

public class Msg {
    private int img_photo;//图片
    private String distance;//距离
    private String dishName;//菜名
    private String monthlSale;//月售数量
    private String price;//价格
    
    //构造函数
    public Msg(int img_photo, String distance, String dishName, String monthlSale, String price) {
        this.img_photo = img_photo;
        this.distance = distance;
        this.dishName = dishName;
        this.monthlSale = monthlSale;
        this.price = price;
    }

    //setter 和 getter
    public int getImg_photo() {
        return img_photo;
    }

    public void setImg_photo(int img_photo) {
        this.img_photo = img_photo;
    }

    public String getDistance() {
        return distance;
    }

    public void setDistance(String distance) {
        this.distance = distance;
    }

    public String getDishName() {
        return dishName;
    }

    public void setDishName(String dishName) {
        this.dishName = dishName;
    }

    public String getMonthlSale() {
        return monthlSale;
    }

    public void setMonthlSale(String monthlSale) {
        this.monthlSale = monthlSale;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

}

(4)定义适配器(适配器)类

提示:设置对象,公共类MsgListAdaper扩展RecyclerView.Adapter <MsgListAdaper.ViewHolder>

package com.example.uirecycleview;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class MsgListAdaper extends RecyclerView.Adapter<MsgListAdaper.ViewHolder> {

    List<Msg> msgList;

    //适配器构造函数
    //构造函数集合是集合msgList,它是RecyclerView数据的直接来源
    public MsgListAdaper (List<Msg> msgList){
        this.msgList =msgList;
    }

    //新建的内部类ViewHolder,视图容器类,装载的就是条目的控件
    class ViewHolder extends RecyclerView.ViewHolder{
        ImageView iv_photo;
        TextView tv_distance;
        TextView tv_dishName;
        TextView tv_monthlSale;
        TextView  tv_price;
        View itemview;//实现控件监听

    //ViewHolder的构造函数,新建ViewHolder对象时必须对其内部控件赋值(控件绑定)
        public ViewHolder(View itemView){
            super(itemView);

        //条目中的id必须不为空,否则会崩溃(与布局文件匹配)
            this.itemview = itemview;  //itemview是本类对象
            iv_photo =itemView.findViewById(R.id.iv_photo);
            tv_distance = itemView.findViewById(R.id.tv_distance);
            tv_dishName = itemView.findViewById(R.id.tv_dishName);
            tv_price = itemView.findViewById(R.id.tv_price);
            tv_monthlSale = itemView.findViewById(R.id.tv_monthlSale);

        }
    }
    @NonNull
    @Override
       /*创建ViewHolder对象
        需要得到条目对应的View的对象*/
    public MsgListAdaper.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        //将布局文件完成View 填充
        View view = View.inflate(viewGroup.getContext(),R.layout.item_msglist,null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    /*给ViewHolder中的控件设置数据(适配渲染数据到View中)
        数据获取的方式是通过List下标->get方法*/
    @Override
    public void onBindViewHolder(@NonNull MsgListAdaper.ViewHolder viewHolder, int i) {

        Msg msg =msgList.get(i);
        viewHolder.iv_photo.setImageResource(msg.getImg_photo());
        viewHolder.tv_distance.setText(msg.getDistance());
        viewHolder.tv_dishName.setText(msg.getDishName());
        viewHolder.tv_price.setText(msg.getPrice());
        viewHolder.tv_monthlSale.setText(msg.getMonthlSale());

            viewHolder.itemview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "你想点 "+msg.getDishName()+ " 外卖", Toast.LENGTH_SHORT).show();
            }
        });
    }

    /*获取条目总数=集合元素个数*/
    @Override
    public int getItemCount() {
        return msgList.size();
    }
}

(5)编写RV所在活动

package com.example.uirecycleview;

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 TOFMsgListActivity extends AppCompatActivity {

    RecyclerView rv;
    List<Msg> msgList =new ArrayList<>();//新建List用于数据存储
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tofmsg_list);

        RecyclerView rv = findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this));//这里默认是垂直布局

        initData();//初始化集合数据

        MsgListAdaper adaper = new MsgListAdaper(msgList); //将数据通过适配器处理
        rv.setAdapter(adaper);
    }


    //进行数据测试
    private void initData() {
        for (int i =0;i<5;i++) {
            Msg msg = new Msg(R.drawable.crayfish, "123m", "麻辣小龙虾", "月售:1000", "¥25");
            msgList.add(msg);

            msg = new Msg(R.drawable.duck, "100m", "北京烧鸭", "月售:1012", "¥50");
            msgList.add(msg);

            msg = new Msg(R.drawable.fish, "300m", "皖鱼片", "月售:1150", "¥68");
            msgList.add(msg);

            msg = new Msg(R.drawable.pig, "154m", "红烧猪耳", "月售:2100", "¥65");
            msgList.add(msg);

            msg = new Msg(R.drawable.pigfoot, "200m", "红烧猪蹄", "月售:560", "¥45");
            msgList.add(msg);
        }
    }
}

4.效果显示(未实现控件监听)

吐司显示(实现控件监听)

猜你喜欢

转载自blog.csdn.net/weixin_40030258/article/details/84551922