RecyclerView 使用 JSON 进行无限滚动

RecyclerView make endless scrolling with JSON

我正在尝试制作我的 Android 应用程序(我只在 iOS 方面有经验)。

我创建了一个从网络获取数据的 RecyclerView。我尝试了一切来实现无限滚动以加载更多项目,但是当我调用函数来获取项目时,整个 RecyclerView 再次加载并且没有在底部附加新结果。

这是我的代码:

ConversationUser.kt

 data class ConversationUser(
     val message_nickname: String, 
     val message_image_thumb: String, 
     val message_large_thumb: String, 
     val message_modified: String, 
     val message_status: String, 
     val message_unread: Int, 
     val conv_id: String, 
     val message_dest: String) {
 }

ConversacionesActivity.kt

class ConversacionesActivity : AppCompatActivity() {

// MARK: Variables

var user_token = ""
var user_id = ""

override fun onCreate(savedInstanceState: Bundle?) {

    // User Defaults

    val sharedPreferences = getSharedPreferences("Preferences", Context.MODE_PRIVATE)
    user_token = sharedPreferences.getString("user_token", "")!!
    user_id = sharedPreferences.getString("user_id", "")!!

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_conversaciones)

    recyclerConv.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))

    getConversationsData()

    recyclerConv.setLoadingListener(object : LoadingListener {
        override fun onRefresh() {
            //refresh data here
            
        }

        override fun onLoadMore() {
            // load more data here
            getConversationsData()

        }
    })
}

fun getConversationsData() {

    val httpAsync = "https://mywebsite.com/conversations/${user_token}"
        .httpPost()
        .responseString { request, response, result ->
            when (result) {
                is Result.Failure -> {
                    val ex = result.getException()
                    println(ex)
                }
                is Result.Success -> {
                    val data = result.get()
                    runOnUiThread {
                        val conversaciones = processJson(data)
                        show(conversaciones)

                        return@runOnUiThread
                    }
                }
            }
        }

    httpAsync.join()

}

fun processJson(json: String): List<ConversationUser> {
    val gson: Gson = GsonBuilder().create()
    val conversaciones: List<ConversationUser> = gson.fromJson(
        json,
        Array<ConversationUser>::class.java
    ).toList()

    return conversaciones
}

fun show(conversaciones: List<ConversationUser>) {
    recyclerConv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
    recyclerConv.adapter = AdaptadorConv(conversaciones, this, user_token, user_id)

}

AdaptadorConv.kt

class AdaptadorConv(
val conversaciones: List<ConversationUser> = ArrayList(),
val context: Context,
val user_token: String,
val user_id: String) : RecyclerView.Adapter<AdaptadorConv.ConvViewHolder>() {

override fun onBindViewHolder(holder: ConvViewHolder, position: Int) {

    holder.convName.text = conversaciones[position].message_nickname
    
    holder.convTime.text = conversaciones[position].message_modified
    
}

override fun getItemCount(): Int {
    return conversaciones.size - 1
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ConvViewHolder {
    val view: View = LayoutInflater.from(parent.context).inflate(
        R.layout.conversaciones,
        parent,
        false
    )
    return ConvViewHolder(view)
}

class ConvViewHolder(vista: View): RecyclerView.ViewHolder(vista) {


    val convImg: ImageView = itemView.findViewById(R.id.convImg)
    val convStatus: ImageView = itemView.findViewById(R.id.convStatus)
    val convName: TextView = itemView.findViewById(R.id.convName)
    val convUnread: TextView = itemView.findViewById(R.id.convUnread)
    val convTime: TextView = itemView.findViewById(R.id.convTime)


}

感谢您的帮助或提示。

请检查您的 show () 方法,您每次都在使用新数据集创建新的 Adapter。您必须将新项目附加到适配器的列表中,并且适配器应设置为列出一次。可以在 here.

找到有用的教程