Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java notifyDataSetChanged()不';t调用&x27;s onBindViewHolder()方法_Java_Android_Listview_Android Recyclerview_Kotlin - Fatal编程技术网

Java notifyDataSetChanged()不';t调用&x27;s onBindViewHolder()方法

Java notifyDataSetChanged()不';t调用&x27;s onBindViewHolder()方法,java,android,listview,android-recyclerview,kotlin,Java,Android,Listview,Android Recyclerview,Kotlin,我有一个RecyclerView的适配器,当我调用我的适配器的updateMessages函数时,我会在其中动态添加项。旧数据列表已正确更改,但RecyclerItems保持不变 这是我的适配器中的updateMessages方法: fun updateMessages(messages: List<MessageReceivedResponseModel>?){ messages?.let { this.messages.clear() this

我有一个RecyclerView的适配器,当我调用我的适配器的updateMessages函数时,我会在其中动态添加项。旧数据列表已正确更改,但RecyclerItems保持不变

这是我的适配器中的updateMessages方法:

fun updateMessages(messages: List<MessageReceivedResponseModel>?){
    messages?.let {
       this.messages.clear()
       this.messages.addAll(messages)
    }
    notifyDataSetChanged()
}
fun更新消息(消息:列表?){
留言?让我{
this.messages.clear()
this.messages.addAll(消息)
}
notifyDataSetChanged()
}
这里还有一个完整的适配器类,我不明白是什么问题

class MessagesRecyclerAdapter(private val itemActionListener: IOnMessageItemActionListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val messages = ArrayList<MessageReceivedResponseModel>()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.awesome_chat_item, parent, false)
    return MyHolder(view)
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    (holder as MyHolder).updateUI(messages[position])
}

override fun getItemCount(): Int {
    return messages.size
}

fun updateMessages(messages: List<MessageReceivedResponseModel>?){
    messages?.let {
        this.messages.clear()
        this.messages.addAll(messages)
    }
    notifyDataSetChanged()
}

private inner class MyHolder internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
    private val messageTextView: TextView = itemView.findViewById(R.id.chat_from_text_id) as TextView
    private val msgQuantityTextView: TextView = itemView.findViewById(R.id.msg_quantity_txt_id) as TextView

    internal fun updateUI(msg: MessageReceivedResponseModel) {
        messageTextView.text = msg.from
        msgQuantityTextView.text = msg.quantity.toString()
    }
}

}
class MessagesRecyclerAdapter(私有val itemActionListener:IOnMessageItemActionListener):RecyclerView.Adapter(){
private val messages=ArrayList()
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
val view=LayoutInflater.from(parent.context)。充气(R.layout.awesome\u chat\u项目,parent,false)
返回MyHolder(视图)
}
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
(持有者作为MyHolder)。更新(消息[位置])
}
重写getItemCount():Int{
返回消息。大小
}
有趣的更新消息(消息:列表?){
留言?让我{
this.messages.clear()
this.messages.addAll(消息)
}
notifyDataSetChanged()
}
私有内部类MyHolder内部构造函数(itemView:View):RecyclerView.ViewHolder(itemView){
private val messageTextView:TextView=itemviewbyd(R.id.chat_from_text_id)作为TextView
private val msgQuantityTextView:TextView=itemView.findViewById(R.id.msg_quantity_txt_id)作为TextView
内部乐趣更新(消息:MessageReceivedResponseModel){
messageTextView.text=msg.from
msgQuantityTextView.text=msg.quantity.toString()
}
}
}
这就是我的适配器和回收器初始化的地方

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater?.inflate(R.layout.activity_awesome_chat, container, false)
    recycler = view?.findViewById(R.id.awesome_chat_list_view_id) as RecyclerView
    val layoutManager = LinearLayoutManager(activity)
    recycler?.layoutManager = layoutManager
.....
}

override fun onMessageReceived(messages: List<MessageReceivedResponseModel>){
        adapter?.updateMessages(messages)
        Log.e(TAG, messages.size.toString())
  }
// called in oncreateView of fragment
private fun initRecycler(items: List<MessageReceivedResponseModel>?) {
    adapter = MessagesRecyclerAdapter(this)
    adapter?.updateMessages(items)
    recycler?.adapter = adapter
    Log.e(TAG, items?.size.toString())
}
override fun onCreateView(充气机:布局充气机?、容器:视图组?、savedInstanceState:Bundle?):视图?{
val视图=充气机?充气(R.layout.activity\u awesome\u chat,container,false)
recycler=view?.findViewById(R.id.awesome\u chat\u list\u view\u id)作为RecyclerView
val layoutManager=LinearLayoutManager(活动)
回收商?.layoutManager=layoutManager
.....
}
覆盖onMessageReceived(消息:列表){
适配器?.updateMessages(消息)
Log.e(标记,messages.size.toString())
}
//在片段的oncreateView中调用
私人娱乐回收商(物品:清单?){
adapter=MessagesRecyclerAdapter(此)
适配器?.updateMessages(项目)
回收器?.adapter=适配器
Log.e(标记,项?.size.toString())
}

您应该使用
notifyDataSetChanged(),如下所示:
adapter.notifyDataSetChanged()
如果您想使用一个可以使用的类,您只需要将适配器变量声明为该类的成员变量,并像上面所说的那样调用该方法。其中,
adapter
是适配器的名称。

尝试使用
notifyItemRangeChanged(0,messages.size-1)


我意识到了我的问题,在所有这些类中,问题出在我的Interactior类中,在该类中,消息检索请求开始

fun startMessageRetrieveRequest(callback: OnRequestFinishedListener<List<MessageReceivedResponseModel>>){
    doAsync {
        Thread.sleep(1000)
        val idx = Random().nextInt(2)
        val its: List<MessageReceivedResponseModel>
        when(idx){
            0 -> its = REs
            1 -> its = RES_1
            else -> its = RES_1
        }
        callback.onResponse(its)
    }
}
fun startMessageRetrieverRequest(回调:OnRequestFinishedListener){
doAsync{
线程。睡眠(1000)
val idx=Random().nextInt(2)
val its:列表
何时(idx){
0->its=REs
1->its=RES_1
else->its=RES_1
}
callback.onResponse(its)
}
}

我删除了doAsync并正常工作,此时正在从非UI线程调用callback.onResponse(),这导致了问题
,只有创建视图层次结构的原始线程才能接触其视图。
,但并不总是如此。另外,应用程序没有崩溃,我错过了日志

尝试将updateMessages方法移动到使用适配器的活动中。我正在从我的活动中调用适配器?.updateMessages(消息:列表)能否显示适配器正在使用的活动?请参阅onMessageReceived()方法他正在适配器中更新适配器,没有问题。你的意思是从片段调用适配器notify方法吗?如果我将伪数据传递给oncreateView()中的initRecycler(),比如initRecycler(listOf(MessageReceivedResponseModel(“from”,1)),它可以正常工作,但是如果我在onMessageReceived()方法中使用此方法,它就无法工作是的。尝试调用notifyDataSetChanged();之后调用initRecycler。也许它在函数中不起作用你能发布整个onCreateView吗?我意识到了我的问题
fun updateMessages(messages: List<MessageReceivedResponseModel>?){
    messages?.let {
        this.messages = messages
        notifyDataSetChanged()
    }
}
fun startMessageRetrieveRequest(callback: OnRequestFinishedListener<List<MessageReceivedResponseModel>>){
    doAsync {
        Thread.sleep(1000)
        val idx = Random().nextInt(2)
        val its: List<MessageReceivedResponseModel>
        when(idx){
            0 -> its = REs
            1 -> its = RES_1
            else -> its = RES_1
        }
        callback.onResponse(its)
    }
}