RecyclerView
- RecyclerView的基本用法
- RecyclerView实现横向滚动
- RecyclerView相比ListView的优点
- 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();
}
});