首页
Preview

在 Android Fragment 中创建 RecyclerView

Android官方文档提供了一个教程,用于在Activity中创建RecyclerView。但是,在Fragment中创建RecyclerView时,稍微有些不同。

步骤1:创建基本Activity项目

打开Android Studio,创建新项目->选择Basic Activity->完成应用程序创建。一旦你在模拟器上运行该应用程序,你将看到一个单个活动应用程序,其中有一个按钮,允许你在两个片段之间切换。

步骤2:创建RecyclerView资源

我们将在SecondFragment中创建一个RecyclerView资源。前往/res/layout/fragment_second.xml,添加以下行来创建RecyclerView:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="409dp"
    android:layout_height="460dp"
    android:layout_marginStart="1dp"
    android:layout_marginTop="1dp"
    android:layout_marginEnd="1dp"
    android:layout_marginBottom="1dp"
    android:visibility="visible"
    app:layout_constraintBottom_toTopOf="@+id/button_second"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

或者,我们也可以在Android Studio的Palette中使用RecyclerView创建:

  • 在fragment_second.xml中,从Palette拖动RecyclerView到Layout中(使用Design视图)。
  • 将RecyclerView id定义为recyclerview
  • 由于这是在ConstraintLayout下创建的,在Layout下定义4个方向的Constraint Widget

步骤3:创建一个带有TextView的FrameLayout

创建RecyclerView后,我们需要为RecyclerView中的每个项目(TextView)定义资源。在**/res/layout/**下创建一个新文件:frame_textview.xml

将以下行复制到这个新文件中。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="8dp">

    <TextView
        android:id="@+id/randomText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="This is some temp text" />

</FrameLayout>

或者,你也可以使用Palette创建TextView

  • 在frame_textview.xml中,从Palette拖动TextView到Layout中(使用Design视图)。
  • 将TextView id定义为randomText

步骤4:在Fragment中添加RecyclerView

recyclerview/SecondFragment.java中,添加以下行将recyclerView注入到片段中。请注意,需要使用_view.findViewById()_而不是直接使用_findViewById()_来检索ReyclerView。_view_可以从_inflater.inflate()_中检索。

public class SecondFragment extends Fragment {

    // Add RecyclerView member
    private RecyclerView recyclerView;

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_second, container, false);

        // Add the following lines to create RecyclerView
        recyclerView = view.findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
        recyclerView.setAdapter(new RandomNumListAdapter(1234));

        return view;
    }

步骤5:创建Recycler ViewHolder

recyclerview/下,创建RecyclerViewHolder.java,添加以下行以定义如何创建ViewHolder。一个ViewHolder包含了RecyclerView中一个项目的必要UI信息。在这个例子中,itemView是来自步骤**#3**的FrameLayout组件。我们需要从FrameLayout中检索并存储TextView randomText

package com.google.firebase.recyclerview;

import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    private TextView view;
    public RecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
        view = itemView.findViewById(R.id.randomText);
    }

    public TextView getView(){
        return view;
    }
}

步骤6:创建RandomNumListAdapter

recyclerview/下,创建RandomNumListAdapter.java,添加以下行以定义如何将数据适配到RecyclerView中。

在这里,我们想在RecyclerView中显示一个随机数列表,因此我们在构造函数中取一个随机性种子作为参数。

在_getItemViewType()中,我们将提供包含列表项TextView的布局文件。在这个例子中,这是来自步骤**#3**的_frame_textview

在_onCreateViewHolder()_中,我们取得了由_getItemViewType()_返回的viewType。在填充FrameLayout以获取View对象后,我们可以使用步骤**#5创建的RecyclerViewHolder**作为返回值。

在_onBindViewHolder()_中,我们将RecyclerViewHolder绑定到RecyclerView。在这个例子中,我们将在运行时为这个视图项生成一个随机数。请注意,每当一个ViewHolder被绑定到RecyclerView时,都会生成一个新的随机数,并将其设置为TextView。因此,我们可以隐含地知道一个项目是否在同一位置上解除绑定并再次绑定。

package com.google.firebase.recyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.Random;

public class RandomNumListAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
    private Random random;

    public RandomNumListAdapter(int seed) {
        this.random = new Random(seed);
    }

    @Override
    public int getItemViewType(final int position) {
        return R.layout.frame_textview;
    }

    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return new RecyclerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
        holder.getView().setText(String.valueOf(random.nextInt()));
    }

    @Override
    public int getItemCount() {
        return 100;
    }
}

结果:具有随机数列表的RecyclerView

现在所有的代码更改都完成了,再次运行应用程序并在模拟器上点击NEXT按钮。如果你看到以下随机数列表,恭喜你!你已经在这个片段中创建了一个RecyclerView!

如果你向下滚动RecyclerView,你会看到更多的随机数。如果你向上滚动,你会发现与之前相同位置的数字不同。这是因为屏幕外的视图项将被自动回收并绑定为当前在屏幕上的另一个视图项。每当一个项目绑定到RecyclerView时,这个应用程序将生成一个新的随机数并将其设置为TextView。

译自:https://medium.com/swlh/create-recyclerview-in-android-fragment-c0f0b151125f

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论