什么是notifyItemRangeChanged(0,this.data.size());在这个例子中,它是如何工作的?

时间:2016-04-04 02:51:42

标签: java android android-recyclerview notifydatasetchanged

我理解var textEnterGo:[String] = ["1","2","3","4","5","6","7","8","9","10"] var wordsPerMinVal:Double = 0 var timer:NSTimer? @IBAction func startEndTouch(sender: AnyObject) { if timer != nil{ index = 0 self.lblText.text = "" timer!.invalidate() timer = nil } wordsPerMinVal = 1 self.timer = NSTimer.scheduledTimerWithTimeInterval(self.wordsPerMinVal, target: self, selector: #selector(ViewController.setTextForLabel), userInfo: nil, repeats: true) } var index:Int = 0 func setTextForLabel(){ self.lblText.text = self.textEnterGo[index] index += 1 if index > self.textEnterGo.count-1{ index = 0 } } ViewHolder的工作原理,但我不清楚onBindViewHolder在这个例子中是如何工作的,以及它的确切作用。

提供给此适配器的数据采用Json格式。

适配器如下:

notifyItemRangeChanged(0, this.data.size());

3 个答案:

答案 0 :(得分:6)

当要在 RecyclerView 中设置的数据发生更改时,适配器需要收到有关数据更改的通知,以便它可以更改 recyclerview。

方法

notifyItemRangedChanged(fromIndex,toIndex);

用于通知适配器在整个数据中更改了一组数据,它告诉适配器适配器应刷新数据并将其重新加载到从传入方法的fromIndex到toIndex的recyclerView中。

如果您更改了多个数据但不是全部,则使用此方法,这些更改的数据也在群集中,以便您可以说从第5到第10个索引数据已更改。

如果所有数据都被更改,请致电:

notifyDataSetChanged();

如果只更改了一个dataItem,则调用:

notifyItemChanged(dataPosition);

答案 1 :(得分:1)

使用notifyItemRangeChanged(0,this.data.size())这是不好的做法。 最好的方法是使用带有效负载的notifyItemChanged或notifyItemRangeChanged。

Payload - 可选参数(键)。这样你就有机会检查你需要什么样的更新。

public void onBindViewHolder(/*...*/, List payloads) {
    if (payloads.isEmpty()) {
        setText(holder, position);
        downloadBitmap(holder, position);
    } else if (payloads.contains(SET_ONLY_TEXT)){
        setText(holder, position);
    }
}

在此示例中,用于检查适配器何时应仅更新文本的有效负载。

答案 2 :(得分:0)

在您的情况下,您没有这样做(notifyItemRangeChanged),因为您可能会调用notifyDataSetChanged();,因为您告诉适配器整个列表已更改而不是特定位置。