【问题标题】:Parsing api using Retrofit and GSON使用 Retrofit 和 GSON 解析 api
【发布时间】:2021-01-07 07:13:31
【问题描述】:

我正在解析 API 并且它正在登录 logcat,但是在检索它并在 recycleview 中使用该数据时遇到了问题。这些是我的代码 sn-ps:

 class MainActivity : AppCompatActivity() {
    private val users = arrayListOf<User>()
    private lateinit var adapter: RecyclerViewAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()

    }

    private fun init() {

        adapter = RecyclerViewAdapter(users)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter
        val myViewModel : UsersViewModel by viewModel()

        myViewModel.getAllUsers().observe(this, Observer {
            users.add(it)
            adapter.notifyDataSetChanged()
        })
        myViewModel.getUsers()
        d("allUsers", users.size.toString())


    }
}

我无法在 recyclerview 中设置数据,谁能给我提示?我找不到合适的源代码或代码 sn-p 来了解如何使用转换器解析数据。

class UsersRequest {
    private var retrofit = Retrofit.Builder()
        .baseUrl("https://reqres.in/api/")
        .addConverterFactory(ScalarsConverterFactory.create())
        .build()

    private var service = retrofit.create(ApiService::class.java)

    interface ApiService {
        @GET("users?page=1")
        fun getRequest(): Call<String>

    }

    fun getRequest(callback: CustomCallback) {
        val call = service.getRequest()
        call.enqueue(onCallback(callback))
    }

    private fun onCallback(callback: CustomCallback): Callback<String> = object : Callback<String> {
        override fun onFailure(call: Call<String>, t: Throwable) {
            d("response", "${t.message}")
            callback.onFailure(t.message.toString())
        }

        override fun onResponse(call: Call<String>, response: Response<String>) {
            d("response", "${response.body()}")
            callback.onSuccess(response.body().toString())

        }

    }
}
class RecyclerViewAdapter(private val users: ArrayList<User>) :
    RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(parent.context).inflate(
                R.layout.user_layout,
                parent,
                false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        return holder.onBind()
    }

    override fun getItemCount() = users.size

    private lateinit var user:User

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun onBind() {
            user = users[adapterPosition]
            itemView.name.text = user.first_name
        }
    }
}
User(
    val id: Int,
    val email: String,
    val first_name: String,
    val last_name: String,
    val avatar: String
)

【问题讨论】:

  • 请贴出回收站视图适配器的代码
  • 基本上你不应该等待 String 类型的响应,而是等待 List

标签: api parsing kotlin gson retrofit


【解决方案1】:

带适配器class RecyclerViewAdapter(private val users: MutableList&lt;User&gt;) : RecyclerView.Adapter&lt;RecyclerViewAdapter.ViewHolder&gt;() { ...

将此方法添加到您的适配器:

fun setUsers(usersList: List<User>) {
    this.users.clear()
    this.users.addAll(usersList)
    notifyDataSetChanged()
}

MainActivity 中简单地说:

myViewModel.getAllUsers().observe(this, Observer {
        users -> hideLoading() // If you have a progress bar, here you can hide it
    users?.let {
      adapter.setUsers(users) }
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多