首先先接受另外一个相似的滚动控件的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.效果显示(未实现控件监听):
吐司显示(实现控件监听):