相比ListView,RecyclerView自定义程度比较高,既可以设定每一项的布局,也可以设定整体的布局。
而且RecyclerView还提供了自己的Adapter和ViewHolder
引入依赖
Gradle Scripts ---> build.gradle(Module:app) ---> dependencies{ }中添加如下代码,紧接着重构项目
implementation 'androidx.recyclerview:recyclerview:1.1.0'
主界面activity_main.xml
<?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/recyclerview"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
列表中每一项的布局list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
/>
</LinearLayout>
RecyclerAdapter extends RecyclerView.Adapter
package com.clc.app2;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class RecyclerAdapter extends RecyclerView.Adapter {
private ArrayList<String> list;
public RecyclerAdapter(ArrayList<String> list) {
this.list = list;
}
/*
onCreateViewHolder,返回自定义viewHolder对象
*/
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false));
}
/*
onBindViewHolder,实现填充数据的逻辑
*/
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MyViewHolder myViewHolder = (MyViewHolder) holder;
myViewHolder.textView.setText(list.get(position));
}
/*
返回总记录数
*/
@Override
public int getItemCount() {
return list.size();
}
/*
内部类
viewholder用于封装控件对象
*/
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.item_text);
}
}
}
MainActivity
package com.clc.music1;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.ServiceConnection;
import android.media.MediaPlayer;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//数据源
ArrayList<String> list = new ArrayList<>();
list.add("aaaaa");
list.add("aaaaa");
list.add("aadasfaaa");
list.add("aaaaa");
list.add("aaaaa");
list.add("aaaaa");
list.add("aaaadsfafa");
list.add("aaaaa");
list.add("aaaaa");
list.add("aaaaa");
RecyclerView recyclerView = findViewById(R.id.recyclerview);
//设置LayoutManager,控制其显示的方式
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
recyclerView.setAdapter(new RecyclerAdapter(list));
}
}
其他用法
网格
RecyclerView recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new GridLayoutManager(this,10));
recyclerView.setAdapter(new RecyclerAdapter(list));
____________________________________________________________________________________________
RecyclerView recyclerView = findViewById(R.id.recyclerview);
//recyclerView.setLayoutManager(new LinearLayoutManager(this));
//recyclerView.addItemDecoration(new MyItemDivider(this,0));
//recyclerView.setLayoutManager(new GridLayoutManager(this,10));
/*
StaggeredGridLayoutManager
交错的网格————>瀑布
横
*/
//recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));
/*
竖
*/
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
recyclerView.setAdapter(new RecyclerAdapter(list));