欢迎访问宙启技术站
智能推送

Android中怎么使用RecyclerView滚动控件

发布时间:2023-05-18 04:43:53

RecyclerView是Android的一种滚动控件,可以用来显示列表等信息。它具有优秀的性能和灵活性,被广泛用于Android应用开发中。

本文将介绍如何在Android应用中使用RecyclerView滚动控件,包括以下内容:

1. 准备工作

2. 创建RecyclerView控件

3. 绑定数据源

4. 自定义布局

5. 添加点击事件

1. 准备工作

在开始使用RecyclerView之前,需要在Android项目中导入RecyclerView库。

在项目的build.gradle文件中添加以下代码:

dependencies {
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
}

然后同步项目即可。

2. 创建RecyclerView控件

在activity_main.xml中创建RecyclerView控件:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在MainActivity.java中找到RecyclerView控件,并设置布局管理器。常用的布局管理器有LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager。

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

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

        mRecyclerView = findViewById(R.id.recycler_view);
        //设置布局管理器为LinearLayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
    }
}

3. 绑定数据源

RecyclerView控件需要一个适配器来绑定数据源。首先创建一个Person类来表示每个人的姓名和年龄。

public class Person {

    private String mName;
    private int mAge;

    public Person(String name, int age) {
        mName = name;
        mAge = age;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    public int getAge() {
        return mAge;
    }

    public void setAge(int age) {
        mAge = age;
    }
}

然后创建一个PersonAdapter类,继承自RecyclerView.Adapter,在构造函数中传入一个Person数组作为数据源。

public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.ViewHolder> {

    private Person[] mPersons;

    public PersonAdapter(Person[] persons) {
        mPersons = persons;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Person person = mPersons[position];
        holder.mNameTextView.setText(person.getName());
        holder.mAgeTextView.setText(String.valueOf(person.getAge()));
    }

    @Override
    public int getItemCount() {
        return mPersons.length;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView mNameTextView;
        private TextView mAgeTextView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mNameTextView = itemView.findViewById(R.id.name_text_view);
            mAgeTextView = itemView.findViewById(R.id.age_text_view);
        }
    }
}

在activity_main.xml中添加item_person布局,用来显示每个人的姓名和年龄。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp">

    <TextView
        android:id="@+id/name_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/age_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:layout_marginStart="16dp" />

</LinearLayout>

最后在MainActivity.java中创建Person数组作为数据源,并将其传递给PersonAdapter。

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

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

        mRecyclerView = findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

        Person[] persons = new Person[]{
                new Person("Tom", 24),
                new Person("Jerry", 26),
                new Person("Mike", 30),
        };
        PersonAdapter adapter = new PersonAdapter(persons);
        mRecyclerView.setAdapter(adapter);
    }
}

现在运行应用,RecyclerView就能够正常显示了。

4. 自定义布局

除了使用item_person布局来显示每个人的姓名和年龄,也可以创建其他的自定义布局。

例如,创建一个item_person_grid布局,用网格的方式显示每个人的姓名和年龄。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:gravity="center">

    <TextView
        android:id="@+id/name_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/age_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp" />

</LinearLayout>

然后在PersonAdapter中修改onCreateViewHolder方法,使用item_person_grid布局。

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

再次运行应用,RecyclerView就能够以网格的方式显示每个人的姓名和年龄了。

5. 添加点击事件

最后,为RecyclerView控件中的每个项添加点击事件。在PersonAdapter中添加一个接口OnItemClickListener,并在ViewHolder中为itemView设置点击事件。

public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.ViewHolder> {

    private Person[] mPersons;
    private OnItemClickListener mOnItemClickListener;

    public PersonAdapter(Person[] persons) {
        mPersons = persons;
    }

    public interface OnItemClickListener {
        void onItemClick(Person person);
    }

    void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    //...

    static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView mNameTextView;
        private TextView mAgeTextView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mNameTextView = itemView.findViewById(R.id.name_text_view);
            mAgeTextView = itemView.findViewById(R.id.age_text_view);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnItemClickListener != null) {
                        int position = getAdapterPosition();
                        mOnItemClickListener.onItemClick(mPersons[position]);
                    }
                }
            });
        }
    }
}

在MainActivity.java中为PersonAdapter设置OnItemClickListener。

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

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

        mRecyclerView = findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

        Person[] persons = new Person[]{
                new Person("Tom", 24),
                new Person("Jerry", 26),
                new Person("Mike", 30),
        };
        PersonAdapter adapter = new PersonAdapter(persons);
        adapter.setOnItemClickListener(new PersonAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(Person person) {
                Toast.makeText(MainActivity.this, "您点击了" + person.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        mRecyclerView.setAdapter(adapter);
    }
}

现在每次点击RecyclerView中的项,都会弹出一个Toast提示信息,告诉您点击了哪个人的姓名。