在Android项目中,怎样添加recyclerview库?

在Android项目中,怎样添加recyclerview库?,第1张

1.添加RecyclerView Android依赖项

要将RecyclerView Selection库添加到Android Studio项目,请implementation 在app 模块的build.gradle 文件中提及以下依赖项:

1.implementation 'com.android.support:recyclerview-v7:28.0.0'

2.implementation 'com.android.support:recyclerview-selection:28.0.0'

2.创建一个列表

在本教程中,我们将使用一小部分项目,每个项目都包含一个人的姓名和电话号码。

要存储每个列表项的数据,请创建一个名为的Kotlin数据类,Person并为其添加两个属性:name 和phone。

1.data class Person(val name:String,

2.val phone: String)

您现在可以继续Person 在主活动中创建对象列表。

val myList = listOf(

Person("Alice", "555-0111"),

Person("Bob", "555-0119"),

Person("Carol", "555-0141"),

Person("Dan", "555-0155"),

Person("Eric", "555-0180"),

Person("Craig", "555-0145")

)

3.将Recycler视图添加到布局

当然,我们将使用RecyclerView 小部件来显示列表。因此

,在主活动的布局XML文件中添加 标记。

要指定列表项的布局,请创建一个新的XML文件并将其命名为list_item.xml。在其中,添加两个TextView 小部件:一个用于显示名称,另一个用于显示电话号码。如果使用LinearLayout 元素来定位窗口小部件,则XML文件的内容应如下所示:

4.创建一个View Holder

您可以将视图持有者视为一个对象,其中包含对列表项布局中存在的视图的引用。没有它,RecyclerView 窗口小部件将无法有效地呈现列表项。

现在,您需要一个视图持有者,它包含TextView 您在上一步中创建的两个小部件。因此,创建一个扩展RecyclerView.ViewHolder 类的新类,并初始化对其中的小部件的引用。这是如何做:

class MyViewHolder(view: View)

: RecyclerView.ViewHolder(view) {

val name: TextView = view.list_item_name

val phone: TextView = view.list_item_phone

// More code here

}

此外,RecyclerView Selection插件需要一种可以调用以唯一标识所选列表项的方法。理想情况下,此方法属于视图持有者本身。此外,它必须返回ItemDetailsLookup.ItemDetails 类的实例。

首先,要明白RecyclerView是做什么的?其次是为什么要用RecyclerView?这里牵扯到RecyclerView和ListView的区别,这里不废话,大家自行百度即可!

以下示例我用的Android API 29 ,启用了AndroidX。

第一步,添加依赖

创建一个新的工程,在app/build.gradle中的dependencies闭包添加以下内容:

implementation 'com.android.support:appcompat-v7:29.0.0'

注意这里的‘29.0.0’要和你的 compileSdkVersion 版本号一致。版本号是28,就改为28。

别的不需要改,以下是此时的项目目录以及gradle文件内容

第二步,创建RecyclerView布局

在你的布局文件中添加RecyclerView,切记要为RecyclerView添加id。

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 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/rv_card"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

</RelativeLayout>

第三步,为RecyclerView中的item创建一个统一的布局文件

在layout下创建一个名为layout_rv_card的布局文件,文件名命名要和你的实际业务相匹配方便后期查找。

在此布局文件中,可以添加任何你想展示的视图,在这里我们先创建两个TextView为大家展示:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="50dp"

android:gravity="center"

android:orientation="horizontal">

<TextView

android:id="@+id/tv_id"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:gravity="center" />

<TextView

android:id="@+id/tv_state"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:gravity="center" />

</LinearLayout>

别忘了添加id。

第四步,创建Adapter

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。

如果之前没有接触过,先跟着做,做完之后就会理解了。

我们在项目目录下新建一个Java类,取名为CardAdapter。

然后在CardAdapter中我们创建一个内部类MyViewHolder继承RecyclerView.ViewHolder。

为什么要创建内部类?

答:就是为了方便而已,创建在外部也是可以,但是如果项目大了之后,类太多不好区分,而且基本上因为布局的不同ViewHolder也基本不同,不会复用,所以创建在内部即可。

为什么要使用ViewHolder?

答:ViewHolder的主要任务:容纳View视图。前边我们提到Adapter连接了后端数据和前端显示,viewHolder的作用就是提供前端的视图文件。

接下来,我们在ViewHolder绑定视图文件,同在activity中类似,itemView顾名思义即列表中每一项的视图,每一项都要绑定。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import android.view.View

import android.widget.TextView

import androidx.annotation.NonNull

import androidx.recyclerview.widget.RecyclerView

/**

* @Author: Messi Mei

* @Date: 2020/8/24 13:46

* @Email: 709909986@qq.com

**/

public class CardAdapter {

class MyViewHolder extends RecyclerView.ViewHolder {

private TextView tvId,tvState

public MyViewHolder(@NonNull View itemView) {

super(itemView)

tvId = itemView.findViewById(R.id.tv_id)

tvState = itemView.findViewById(R.id.tv_state)

}

}

}

第五步,完成Adapter

在我们创建的CardAdapter类继承我们创建的内部类MyViewHolder,并重写提供的三个方法:

onCreateViewHolder(),onBindViewHolder(),getItemCount()

import android.view.View

import android.view.ViewGroup

import android.widget.TextView

import androidx.annotation.NonNull

import androidx.recyclerview.widget.RecyclerView

/**

* @Author: Messi Mei

* @Date: 2020/8/24 13:46

* @Email: 709909986@qq.com

**/

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyViewHolder>{

@NonNull

@Override

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

return null

}

@Override

public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

}

@Override

public int getItemCount() {

return 0

}

class MyViewHolder extends RecyclerView.ViewHolder {

private TextView tvId,tvState

public MyViewHolder(@NonNull View itemView) {

super(itemView)

tvId = itemView.findViewById(R.id.tv_id)

tvState = itemView.findViewById(R.id.tv_state)

}

}

}

5.1重写onCreateViewHolder方法,返回我们的内部类MyViewHolder ,此处为将我们的item布局文件和adapter绑定。

@NonNull

@Override

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

LayoutInflater inflater = LayoutInflater.from(parent.getContext())

View view = inflater.inflate(R.layout.layout_rv_card,parent,false)

return new MyViewHolder(view)

}

也可以写为

@NonNull

@Override

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

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_rv_card,parent,false)

return new MyViewHolder(view)

}

一样的。

5.2为每一项视图,添加数据。

此处holder为你每一项的MyViewHolder对象,position 定位,可以理解为list下标。

@Override

public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

holder.tvId.setText(position)

holder.tvState.setText(position+position)

}

5.3返回列表大小

@Override

public int getItemCount() {

return 0

}

第六步,创建数据接口

创建一个List列表(当然也可以是JsonArray),以此为例,我们创一个Card实体类,为List添加该类泛型。

6.1接下来在CardAdapter创建一个带该list的构造器

List<Card>list

public CardAdapter(List<Card>list) {

this.list = list

}

6.2在getItemCount方法中返回该列表大小

@Override

public int getItemCount() {

return list == null ? 0 : list.size()

}

6.3在onBindViewHolder方法中绑定真实数据

@Override

public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

holder.tvId.setText(list.get(position).getId())

holder.tvState.setText(list.get(position).getState())

}

以下为整体代码(文末有我在使用RecycleView中对Adapter的改进代码,如有需要可以参考):

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.List

/** @Author: Messi Mei @Date: 2020/8/24 13:46 @Email: 709909986@qq.com */

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyViewHolder>{

private List<Card>list

public CardAdapter(List<Card>list) {

this.list = list

}

@NonNull

@Override

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

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_rv_card, parent, false)

return new MyViewHolder(view)

}

@Override

public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

holder.tvId.setText(list.get(position).getId())

holder.tvState.setText(list.get(position).getState())

}

@Override

public int getItemCount() {

return list == null ? 0 : list.size()

}

static class MyViewHolder extends RecyclerView.ViewHolder {

private TextView tvId, tvState

MyViewHolder(@NonNull View itemView) {

super(itemView)

tvId = itemView.findViewById(R.id.tv_id)

tvState = itemView.findViewById(R.id.tv_state)

}

}

}

第七步,使用RecycleView

在Activity中创建RecycleView对象并绑定视图,创建Adapter对象。

在initData中初始化数据。

package com.mz.myapplication

import android.os.Bundle

import androidx.appcompat.app.AppCompatActivity

import androidx.recyclerview.widget.LinearLayoutManager

import androidx.recyclerview.widget.RecyclerView

import java.util.ArrayList

import java.util.List

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView

private CardAdapter cardAdapter

private List<Card>list

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

initData()

initView()

}

private void initData() {

list = new ArrayList<>()

for (int i = 0i <50i++) {

Card card = new Card()

card.setId(i+1+"")

if (i%2 == 1){

card.setState("在线")

}else{

card.setState("离线")

}

list.add(card)

}

}

private void initView() {

recyclerView = findViewById(R.id.rv_card)

cardAdapter = new CardAdapter(list)

recyclerView.setLayoutManager(new LinearLayoutManager(this))

recyclerView.setAdapter(cardAdapter)

}

}

至此,运行即可。

如果你想要更复杂的列表布局,在布局文件中加入相应的视图即可,修改完后记得在ViewHolder中加入、绑定相应的视图,在Adapter中的onBindViewHolder为其添加、绑定数据。

在.xml文件的design界面点击recyclerview右边的小箭头,然后点击ok即可

作用:显示是否完成拖动 *** 作

作用:在拖动时变色来显示当前状态

第三个界面要要用于显示拖动效果,所以要进行相应的修改

添加adapter依赖

将要显示的列表文本及相应功能添加进去

对拖动事件进行监听

配置拖动功能

在/res/values/styles.xml文件里,将

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

改为

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

到此,实验结束


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11388671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存