我有一个物品的recyclerView,其中包含从WS检索到的游戏持续时间的timeStamp。为了显示匹配的持续时间,我必须得到当前的timeStamp,做垫子并将其转换为可读格式(例如:5分钟5s)。只需要更新一些视图。
每个子视图需要每隔xxx秒更新一次。
我的第一个方法是创建一个绑定到需要更新的视图的对象列表。在我的片段上,我将声明一个Handler并为列表中的每个对象调用notifyItemChanged(position)。每次处理程序调用notifyItemChanged时,都会重新渲染整个视图,并且会产生一个小的闪烁效果。我不希望它发生,所以我的第二种方法是只更改每个需要更新的childView的TextView。这是代码:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
if (needsUpdate) {
holder.startRepeatingTask();
} else {
holder.stopRepeatingTask();
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
private final int mHandlerInterval = 6000;
private Handler mHandler;
private Runnable mStatusChecker;
public MyViewHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);
mHandler = new Handler();
mStatusChecker = new Runnable() {
@Override
public void run() {
String gameStatusToPrint = current.getGameStatusToPrint();
gameStatus.setText(gameStatusToPrint);
mHandler.postDelayed(mStatusChecker, mHandlerInterval);
}
};
}
public void startRepeatingTask() {
mStatusChecker.run();
}
public void stopRepeatingTask() {
mHandler.removeCallbacks(mStatusChecker);
}
}
我不确定这是否是最佳方法,需要就此提出建议。
答案 0 :(得分:1)
ViewHolder将由RecyclerView回收。您需要确保维持“当前游戏”与列表中显示的项目之间的稳定性。尽管如此,我认为你的解决方案很好。
以下是对此的修复:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.game = mGameList.get(position);
if (needsUpdate) {
holder.startRepeatingTask();
} else {
holder.stopRepeatingTask();
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
private final int mHandlerInterval = 6000;
private Handler mHandler;
private Runnable mStatusChecker;
public Game game;
public MyViewHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);
mHandler = new Handler();
mStatusChecker = new Runnable() {
@Override
public void run() {
String gameStatusToPrint = game.getGameStatusToPrint();
gameStatus.setText(gameStatusToPrint);
mHandler.postDelayed(mStatusChecker, mHandlerInterval);
}
};
}
public void startRepeatingTask() {
mStatusChecker.run();
}