我有一个RecyclerView
,其中包含Product
的列表,其中包含图片,文字和CountDownTimer
,我调用了一个接口回调来自我的Product
更改的每一秒我的Adapter
课程。我只需刷新一个TextView
我的布局,但notifyItemChanged
调用onBindViewHolder
并刷新我项目的所有数据。仅刷新项目的一个TextView的最佳方法是什么?
public void onBindViewHolder(final ViewHolderCustom holder, final int position) {
final Product currentProduct = listProduct.get(position);
holder.productBrand.setText(currentProduct.getBrand());
holder.productName.setText(currentProduct.getName());
holder.productPrice.setText(currentProduct.getPrice());
holder.time.setText(String.valueOf(currentProduct.getTime()));
String urlImg = currentProduct.getPicture();
Log.v("adapter", "item " + position);
if (!urlImg.equals("empty")) {
imageLoader.get(urlImg, new ImageLoader.ImageListener(){...});
}
if (currentProduct.getId() == 1 && test == 0) {
test = 1;
currentProduct.Start_countDown(new Product.TimeCallBack() {
@Override
public void timeCallback(Product product) {
int index = listProduct.indexOf(product);
notifyItemChanged(index);
}
});
}
}
答案 0 :(得分:1)
It will notify the particular position rather that whole list,
@Override
public void timeCallback(Product product) {
listProduct.set(position, product);
notifyItemChanged(position);
}
答案 1 :(得分:1)
notifyItemChanged(position);
是正确的方法。如果你有一个大的背景图像,即使在缓存时,如果你在同一个项目上过快地调用notifyItemChanged
,你会看到一些闪烁。
对于您的用例,您只需要重绘一个视图,这样您就可以直接更新它:
public void updateTime(ViewHolderCustom holder) {
holder.time.setText(String.valueOf(currentProduct.getTime()));
holder.time.invalidate();
}
答案 2 :(得分:0)
替换列表中特定索引的新数据,并通过notifyItemInserted
通知适配器:
@Override
public void timeCallback(Product product) {
listProduct.add(position, product);
notifyItemInserted(position);
}