如何将来自 API 的数据显示为 gridview - Kotlin - Retrofit

How to display data from API as gridview - Kotlin - Retrofit

我正在尝试将来自 API 的数据显示为 gridview 我尝试了不同的方法来做到这一点,但它要么显示不正确,要么显示在彼此之上

那么正确的做法是什么?

这是我的代码:

接口:

interface facebookInterface {

@GET(" ")

fun getServices(): Call<List<facebookData>>

companion object Factory {
    fun create(): facebookInterface {
        val retrofit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("URL")
            .build()

        return retrofit.create(facebookInterface::class.java)
    }
}
}

适配器:

class facebookAdapter(var countryList: List<facebookData>,
                  private val facebookAdapterCallback: FacebookAdapterCallback)
: RecyclerView.Adapter<facebookAdapter.ViewHolder>(){
lateinit var context: Context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): facebookAdapter.ViewHolder {
    context = parent.context!!
    val view = LayoutInflater.from(context).inflate(R.layout.facebook_list_item, parent, false)
    return ViewHolder(view)
}

override fun getItemCount(): Int {
    return if(countryList.size > 4) {
        4
    } else {
        countryList.size
    }
}

override fun onBindViewHolder(holder: facebookAdapter.ViewHolder, position: Int) {


    holder.thumbnailUrl.setOnClickListener {
        facebookAdapterCallback.onFacebookAdapterItemClick(countryList[position])
    }

    Picasso.get()
        .load(countryList[position].imageUrl)
        .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
        .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
        .into(holder.thumbnailUrl)
}

class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

    val thumbnailUrl: ImageView = itemView.findViewById(R.id.facebook_img)
}

interface FacebookAdapterCallback{
    fun onFacebookAdapterItemClick(data: facebookData)
}
}

facebook_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.cardview.widget.CardView
    android:id="@+id/list_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="4dp"
    app:contentPadding="8dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/list_constraint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/facebook_img"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

activity:

val recyclerView: RecyclerView = findViewById(R.id.list_recycler4)
recyclerView.layoutManager = LinearLayoutManager(this)
val facebookInterface = facebookInterface.Factory.create()
val facebok: Call<List<facebookData>> = facebookInterface.getServices()
facebok.enqueue(object : Callback<List<facebookData>> {
    override fun onFailure(call: Call<List<facebookData>>, t: Throwable) {
        Log.d("xxxx", t.toString())
        Toast.makeText(this@MainActivity, t.message, Toast.LENGTH_SHORT).show()
    }
    override fun onResponse(
        call: Call<List<facebookData>>,
        response: Response<List<facebookData>>
    ) {
        Log.d("xxxx", response.body().toString())
        val list = response.body()!!
        recyclerView.adapter = facebookAdapter(list, this@MainActivity)
    }
})

数据class:

data class facebookData (
val  imageUrl : String,
val imageLink: String,
val source: String
)

我尝试制作 XML 网格视图,但它只会拍摄第一张图片并在垂直视图中重复它

我是否需要更改适配器或 XML?

我试图将“val recyclerView: RecyclerView = findViewById(R.id.list_recycler4)”更改为 gridview,但我遇到了一些问题

您可以使用 RecyclerView 的 GridLayout 管理器而不是使用线性布局管理器轻松地做到这一点。

recyclerView.layoutManager = GridLayoutManager(this,2)

这是上下文,2 是网格的计数,您可以根据需要使用 3 或其他。