当前位置:网站首页>RecycleView和ViewPager2
RecycleView和ViewPager2
2022-08-05 05:15:00 【suiyue010211】
目录
第一步,在适配器中的onBindViewHolder方法中给视图获取监听
RecycleView
RecycleView简介
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替 传统的ListView,更加强大和灵活。 RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这 一点从它的名字Recyclerview即回收view也可以看出。 RecyclerView 支持 线性布局、网格布局、瀑布流布局 三种,而且同时还能够控制横向还是纵向滚 动。
1.容器性质的控件
2.用于大量数据展示的新控件
RecycleView纵向排列
首先在主布局中引入RecyclerView控件。
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_address"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
创建子布局,然后在子布局中,写好自己的子项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="horizontal"
android:padding="10dp"
android:layout_height="wrap_content">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#FFFFFF" />
<ImageView
android:id="@+id/iv_img"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/tv_tx"
android:layout_width="300dp"
android:layout_gravity="center_vertical"
android:textSize="20dp"
android:layout_height="wrap_content" />
</LinearLayout>
编写实体类
package com.wzk.recyclerview.model;
public class AddressBook {
private String name;
private int imgid;
public AddressBook(String name, int imgid) {
this.name = name;
this.imgid = imgid;
}
public String getName() {
return name;
}
public int getImgid() {
return imgid;
}
}
创建适配器
package com.wzk.recyclerview.adapter;
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 androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.wzk.recyclerview.R;
import com.wzk.recyclerview.model.AddressBook;
import java.util.List;
public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.ViewHolder> {
//存储有多少条数据然后在getItemCount方法里做循环
private List<AddressBook> list;
public AddressAdapter(List<AddressBook> list){
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//获取要展示的视图
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addressbook_item, parent, false);
//返回视图
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//取出list中数据写进视图中
AddressBook addressBook = list.get(position);
holder.iv_img.setImageResource(addressBook.getImgid());
holder.tv_tx.setText(addressBook.getName());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
View view;
ImageView iv_img;
TextView tv_tx;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_img=itemView.findViewById(R.id.iv_img);
tv_tx=itemView.findViewById(R.id.tv_tx);
}
}
}
在主活动中使用
package com.wzk.recyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.wzk.recyclerview.adapter.AddressAdapter;
import com.wzk.recyclerview.model.AddressBook;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//写要填的数据
private String[] names={"男一","男二","男三","男四","女一","女二","女三","女四"};
private int[] imgs={R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv};
private List<AddressBook> list=new ArrayList<>();
private RecyclerView rv_address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//整合数据,存进list中
initData();
//根据id获取控件
rv_address=findViewById(R.id.rv_address);
//把适配器拿出来用,把list传进适配器中
AddressAdapter adapter=new AddressAdapter(list);
//在设置适配器之前设置布局管理器
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
rv_address.setLayoutManager(layoutManager);
//给控件用适配器赋值
rv_address.setAdapter(adapter);
}
private void initData() {
for (int i = 0; i < names.length ;i++) {
AddressBook addressBook=new AddressBook(names[i],imgs[i]);
list.add(addressBook);
}
}
}
RecycleView横向排列
只需要在设置布局管理器的时候添加一个横向布局即可
//在设置适配器之前设置布局管理器
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
RecycleView网格布局
将布局管理器设置为GridLayoutManager
//根据id获取控件
rv_address=findViewById(R.id.rv_address);
//把适配器拿出来用,把list传进适配器中
AddressAdapter adapter=new AddressAdapter(list);
//在设置适配器之前设置布局管理器
GridLayoutManager layoutManager=new GridLayoutManager(this,3);
rv_address.setLayoutManager(layoutManager);
//给控件用适配器赋值
rv_address.setAdapter(adapter);
RecycleView的点击事件
RecyclerView的点击事件比ListView的点击事件更精确。 假如我是用的是ListView,那么我点击子项的时候,无论我点击图片还是文字,他都只知道,我点击了 子项。但是如果使用的是RecyclerView,他就可以准确地判断出我点击了文字还是图片! 修改代码其实也很简单,只用修改适配器里的代码。主要是给最外层布局和图片加了点击事件,所以点 击图片的时候会有Toast,点击文字的时候因为没有给文字注册点击事件,所以会被最外层布局捕捉到, 相当于点击了最外层布局。
第一步,在适配器中的onBindViewHolder方法中给视图获取监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
}
});
第二步,在ViewHolder中设置视图
public class ViewHolder extends RecyclerView.ViewHolder{
View view;
ImageView iv_img;
TextView tv_tx;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_img=itemView.findViewById(R.id.iv_img);
tv_tx=itemView.findViewById(R.id.tv_tx);
}
}
边栏推荐
猜你喜欢
随机推荐
数据库期末考试,选择、判断、填空题汇总
[Go through 9] Convolution
flink实例开发-batch批处理实例
第二讲 Linear Model 线性模型
flink基本原理及应用场景分析
flink on yarn 集群模式启动报错及解决方案汇总
【Over 16】Looking back at July
Matplotlib(三)—— 实践
Machine Learning (2) - Machine Learning Fundamentals
基于Flink CDC实现实时数据采集(二)-Source接口实现
The difference between the operators and logical operators
Redux
Flink accumulator Counter 累加器 和 计数器
Pandas(五)—— 分类数据、读取数据库
对数据排序
Flink EventTime和Watermarks案例分析
【过一下9】卷积
Opencv中,imag=cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY) 报错:error:!_src.empty() in function ‘cv::cvtColor‘
Mesos learning
[Study Notes Dish Dog Learning C] Classic Written Exam Questions of Dynamic Memory Management