android - recyclerview 定期 ui 子更新

标签 android android-recyclerview

我有一个项目的 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/

相关文章:

java - SQL 语句应该返回 2 行,但只返回 1 行

android - 滚动条未在 RecyclerView 中显示

android - 将项目粘贴到 recyclerview 顶部

android - 可扩展的 RecyclerView Android Studio 示例

java - 无法刷新 RecyclerView

android - 通过 ADB 在 Android 上发送短信

android - 如何根据是否选择CardView更改背景色?

android - 如何在 Recyclerview 中将 Clicked 位置居中

Android RatingBar - 一团糟

java - 将 APK 转换为 JAR