当前位置: 首页 > 知识库问答 >
问题:

在通知后闪烁

陈鸿才
2023-03-14

我有一个RecyclerView,它从API加载一些数据,包括一个图像url和一些数据,我使用networkImageView延迟加载图像。

@Override
public void onResponse(List<Item> response) {
   mItems.clear();
   for (Item item : response) {
      mItems.add(item);
   }
   mAdapter.notifyDataSetChanged();
   mSwipeRefreshLayout.setRefreshing(false);
}

下面是适配器的实现:

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
        if (isHeader(position)) {
            return;
        }
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        MyViewHolder holder = (MyViewHolder) viewHolder;
        final Item item = mItems.get(position - 1); // Subtract 1 for header
        holder.title.setText(item.getTitle());
        holder.image.setImageUrl(item.getImg_url(), VolleyClient.getInstance(mCtx).getImageLoader());
        holder.image.setErrorImageResId(android.R.drawable.ic_dialog_alert);
        holder.origin.setText(item.getOrigin());
    }

问题是,当我们在recyclerView中刷新时,它会在开始时短暂闪烁,这看起来很奇怪。

我只是使用了GridView/ListView,它就像我预期的那样工作。没有闪电战。

在我的片段创建的视图中配置RecycleView:

mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        mGridLayoutManager = (GridLayoutManager) mRecyclerView.getLayoutManager();
        mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return mAdapter.isHeader(position) ? mGridLayoutManager.getSpanCount() : 1;
            }
        });

        mRecyclerView.setAdapter(mAdapter);

有人面临这样的问题吗?原因可能是什么?

共有3个答案

汪晨
2023-03-14

这很管用:

recyclerView.getItemAnimator().setChangeDuration(0);
逑彬炳
2023-03-14

根据本期的报道。。。。这是默认的recycleview项目更改动画。。。你可以把它关掉。。试试这个

recyclerView.getItemAnimator().setSupportsChangeAnimations(false);

最新版本的更改

摘自Android开发者博客:

请注意,这个新API不向后兼容。如果以前实现了ItemAnimator,则可以扩展SimpleItemAnimator,它通过包装新的API来提供旧的API。您还将注意到,一些方法已完全从ItemAnimator中删除。例如,如果你打电话给recyclerView。getItemAnimator()。setSupportsChangeAnimations(false),此代码将不再编译。您可以将其替换为:

ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
  ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
余铭晨
2023-03-14

尝试在你的RecyclerView中使用稳定的ID。适配器

setHassTableId(true)和overridegetItemId(int-position)

如果没有稳定的ID,在通知后,ViewHolders通常被分配到不相同的位置。这就是我眨眼的原因。

你可以在这里找到一个很好的解释。

 类似资料:
  • 我正在开发一个倒计时应用程序,目前正在尝试在倒计时运行时退出应用程序时显示通知。相应地,我希望在用户返回应用程序时通知消失。 到目前为止,我已经设法使它适用于带有静态文本的简单通知,执行以下操作:在MainActivity.java中,在onStop()中,我创建一个意图并使用start Service(意图)启动服务。对称地,在onStart()中,我运行stop Service(意图),以便当

  • 我需要帮助。Firebase通知在后台不工作。这是我的代码:

  • 使用场景 针对兑吧后台,开发者自有加钱购商品的售后处理处理操作之后的结果状态通知(仅支持开发者自有商品)。售后完成之后,兑吧通过该接口将售后的结果通知给开发者,开发者跟进售后通知的结果处理判定是否给用户返还积分 接口说明 请求方式 (get请求) 接口地址由开发者提供,当有售后完成订单时兑吧通过接口请求开发者,开发者通过接口接收请求数据并处理请求。 请求参数 参数 参数类型 是否必须 参数说明 a

  • 问题内容: 我想在重新启动后通知工作正常。我提醒开始,但一次。如果我随后更改了手机上的日期,则没有通知。只有再次运行该应用程序,它们才会运行。也就是说,在不启动应用程序的情况下重新启动电话后,启动电话时,通知仅显示一次。 我在 MainActivity中 设置了通知时间: MyAlarmService (onCreate): MyReceiver: AndroidManifest(MyReceiv

  • 您可以看到,我的JSON中有两个块:一个通知块(在后台接收通知),一个数据块(在前台接收通知)。 我不明白为什么没有收到后台通知。我的怀疑是关于块的顺序(如果我把“数据”块放在“通知”块之前会有问题吗?)。 编辑:有关问题的更多信息。 编辑2: 当应用程序在后台时,不会收到通知,但当我打开应用程序时,会立即收到相同的通知(方法didReceiveRemoteNotification被激发)。

  • 当应用程序关闭时,我无法使通知工作。 我从FCM/GCM(python服务器)发送此消息: 所以curl是这样的: curl-头"授权:key=MYKEY"-头"内容类型:应用/json"https://fcm.googleapis.com/fcm/send-d'{"registration_ids":["APA91bEDB9dVf-..."],"collapse_key":空,"content_