我理解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());
答案 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();
,因为您告诉适配器整个列表已更改而不是特定位置。