recyclerview periodic ui child updates

时间:2015-05-22 17:39:55

标签: android android-recyclerview

我有一个物品的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);
      }
    }
    

我不确定这是否是最佳方法,需要就此提出建议。

1 个答案:

答案 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();
        }