我有一个项目的 recyclerView,(除其他外)包含从 WS 检索的游戏持续时间的时间戳。为了显示比赛的持续时间,我必须获取当前时间戳,做垫子并将其转换为可读格式(例如:5 分钟 5 秒)。只有部分 View 需要更新。
每个 subview 需要每 xxx 秒更新一次。
我的第一个方法是创建一个绑定(bind)到需要更新的 View 的对象列表。在我的 fragment 上,我会声明一个 Handler 并为列表中的每个对象调用 notifyItemChanged(position)。每次处理程序调用 notifyItemChanged 时,整个 View 都会重新呈现,并且有一个小的闪烁效果。我不希望它发生,所以我的第二种方法是只更改需要更新的每个 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); } }
我不确定这是否是最佳方法,需要对此提出建议。
最佳答案
因为 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();
}
关于android - recyclerview 定期 ui 子更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402790/