Contents

RecyclerView 简单使用

RecyclerView

这个 View 的使用当初我用的不是很明白,现在有点懂了,我们自顶向下设计 View

代码总览

MainActivity 中,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    List<Integer> data = Stream.iterate(1, n -> n + 1).limit(100).collect(Collectors.toList());
    CustomAdapter adapter = new CustomAdapter(data);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 4);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(layoutManager);
}

我们

  1. 定义了一个 RecyclerView
  2. 定义了一个 CustomAdapter
  3. CustomAdapter 提供了数据
  4. RecyclerView 设置 adapter
  5. RecyclerView 设置 layoutmanager

注意,这里我们没用到 ViewHolder 这个东西,这个东西由 Adapter 操纵,相当于

  • RecyclerView
    • Adapter
      • ViewHolder
      • ViewHolder
      • ViewHolder
      • ViewHolder

有关Adapter

定义 Adapter 需要继承 RecyclerView.Adapter ,他的作用是衔接 RecyclerViewViewHolder ,即 RecyclerView 通过 Adapter 来设置每个 ViewHolder 的视图,这里我们需要设置三个关键方法

  • onCreateViewHolder 每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法n 此方法会创建并初始化 ViewHolder 及其关联的 View ,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。
  • onBindViewHolder RecyclerView 调用此方法将 ViewHolder 与数据相关联
  • getItemCount RecyclerView 调用此方法来获取数据集的大小

这里我们为 Adapter 设置私有数据 data

public class CustomAdapter extends RecyclerView.Adapter<CustomViewHolder> {
    private List<Integer> data;

    public CustomAdapter(List<Integer> data) {
	this.data = data;
    }

    @NonNull
    @Override
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
	final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
	return new CustomViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
	holder.setText(String.format("this is item %d", data.get(position)));
    }

    @Override
    public int getItemCount() {
	return data.size();
    }
}

由于上面的代码使用到了 ViewHolder ,也要看下面的代码才能理解

有关ViewHolder

ViewHolder 用来表示一个布局,因此需要为其设置布局和类代码,这里随便布局一下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	      android:layout_width="match_parent"
	      android:layout_height="wrap_content">
  <TextView android:id="@+id/textview"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"/>
</LinearLayout>
public class CustomViewHolder extends RecyclerView.ViewHolder {
    TextView textView;
    public CustomViewHolder(@NonNull View itemView) {
	super(itemView);
	textView = itemView.findViewById(R.id.textview);
    }

    public void setText(String text) {
	textView.setText(text);
    }
}

ViewHolder 中,我们

  • 为其定义了一个私有变量 TextView
  • 定义了一个 setText 来设置 TextView 的显示
  • 外部可以使用 setText 来设置布局的显示,看 Adapter 的代码

至此,相关代码已完成编写,可以运行了