- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在所有 RecyclerView
上都遇到了一个很奇怪的问题在我的申请中。这不是我第一次使用 RecyclerView
但这是第一次发生。我认为最好的解释方式是用照片:
列表不断更新,因此经常调用通知方法。代码有点太复杂,无法发布,但我确信一切都是从 UI 线程调用的。
此处要求的是代码和布局。
代码:
public class PlayersAdapter extends RecyclerView.Adapter<PlayersAdapter.ViewHolder> {
private final List<GameInfo.Player> players;
private final LayoutInflater inflater;
public PlayersAdapter(Context context, List<GameInfo.Player> players) {
this.inflater = LayoutInflater.from(context);
this.players = players;
setHasStableIds(true);
}
@Override
public long getItemId(int position) {
return players.get(position).name.hashCode();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(parent);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
GameInfo.Player player = players.get(position);
holder.name.setText(player.name);
holder.update(player);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
if (payloads.isEmpty()) {
onBindViewHolder(holder, position);
} else {
holder.update((GameInfo.Player) payloads.get(0));
}
}
@Override
public int getItemCount() {
return players.size();
}
public void notifyItemChanged(GameInfo.Player player) {
int pos = players.indexOf(player);
if (pos != -1) {
players.set(pos, player);
notifyItemChanged(pos, player);
}
}
public void notifyDataSetChanged(List<GameInfo.Player> players) {
this.players.clear();
this.players.addAll(players);
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
final TextView name;
final SuperTextView score;
final ImageView status;
ViewHolder(ViewGroup parent) {
super(inflater.inflate(R.layout.player_item, parent, false));
setIsRecyclable(false);
name = itemView.findViewById(R.id.playerItem_name);
score = itemView.findViewById(R.id.playerItem_score);
status = itemView.findViewById(R.id.playerItem_status);
}
void update(GameInfo.Player player) {
score.setHtml(R.string.score, player.score);
switch (player.status) {
case HOST:
status.setImageResource(R.drawable.ic_person_black_48dp);
break;
case IDLE:
status.setImageResource(R.drawable.ic_access_time_black_48dp);
break;
case JUDGING:
case JUDGE:
status.setImageResource(R.drawable.ic_gavel_black_48dp);
break;
case PLAYING:
status.setImageResource(R.drawable.ic_hourglass_empty_black_48dp);
break;
case WINNER:
status.setImageResource(R.drawable.ic_star_black_48dp);
break;
case SPECTATOR:
status.setImageResource(R.drawable.ic_remove_red_eye_black_48dp);
break;
}
}
}
}
GameInfo.Player
类:
public static class Player {
public final String name;
public final int score;
public final PlayerStatus status;
public Player(JSONObject obj) throws JSONException {
name = obj.getString("N");
score = obj.getInt("sc");
status = PlayerStatus.parse(obj.getString("st"));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Player player = (Player) o;
return name.equals(player.name);
}
}
自定义项目布局(R.layout.player_item):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="4dp">
<ImageView
android:id="@+id/playerItem_status"
android:layout_width="32dp"
android:layout_height="32dp"
android:alpha="0.54"
android:padding="4dp"
android:scaleType="fitCenter" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="8dp">
<TextView
android:id="@+id/playerItem_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textColor="@android:color/primary_text_light"
android:textSize="14sp" />
<com.gianlu.commonutils.SuperTextView
android:id="@+id/playerItem_score"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
编辑:删除 onBindViewHolder(ViewHolder holder, int position, List<Object> payloads)
方法仅在我使用 notifyItemChanged(pos, player)
时才解决问题,问题仍然存在 notifyItemChanged(pos)
.很高兴知道为什么会这样。
最佳答案
我已经通过删除 onBindViewHolder(ViewHolder holder, int position, List<Object> payloads)
解决了这个问题方法,使用 notifyItemChanged(pos)
而不是 notifyItemChanged(pos, player)
并设置 ViewHolder
可回收 setIsRecyclable(true)
.感谢@RahulKumar 的建议。
关于android - RecyclerView overdraw 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47053131/
ChequeAccount 类扩展了 Account 类。帐户类包含 ID、名称和余额属性。 ChequesAccount 类具有来自帐户的 overdraftLimit、amtOverdrawn 和
我正在开发一款生成敌人的游戏。尽管一旦生成这些敌人,它们就会立即再次消失,因为背景是在它们之上绘制的。 有没有办法在 Pygame 中拥有层系统? 重现问题的代码: import pygame imp
使用 gradle 构建时,lint 报告报告以下内容: Overdraw: Painting regions more than once ../../src/main/res/layout/inc
这是一个很难在 Google 中搜索的问题,因为它在财务方面具有其他含义。 当然,我这里的意思是“绘图”,如..计算机图形..不是钱.. 我对防止 3D 绘图和 2D 绘图的过度绘制很感兴趣。 (我应
给定以下包含财务数据的 data.table(3500 万行): DT: userId Date balance overdraft (boolean) 600 2014-
大家好,我正在尝试在用户申请 overdraw 时收取 50 的 overdraw 费用。我的代码如下: public void Withdraw(double amount){ int
编辑:使用 awt... 我试图在基于小程序的数学游戏中显示随机数,但遇到了问题。根据调用方法的位置,会发生以下两种情况之一: 数字生成并正确显示,不会自动更新每一帧但在运行时更新时每一帧都会被背景和
我正在编写的 BI 应用程序有问题。 该应用程序将 AChartEngine 用于图表,并且大部分表格数据都是以编程方式扩充的。目前我面临两个主要问题: 当应用程序切换方向时,大约需要 8-10 秒来
自从我阅读了this我一直在尝试创建一个模拟器,我可以在其中使用“Show GPU Overdraw”。 我遵循了提示 here和 there ,但在新工具中,当创建新的 AVD 时,我找不到启用 G
我必须在 iOS 中创建以下布局。 在 android 中,我们可以使用单个 EditText 来创建它。但是在 iOS 中我们需要 用于背景的 imageView 文本的文本字段 搜索图标的 Ima
我想做的是设置 overdraw 限额,即 -150 如果余额为 -150,用户将无法再提款。我的代码如下: 提现方式 public void Withdraw(double amount){
我在所有 RecyclerView 上都遇到了一个很奇怪的问题在我的申请中。这不是我第一次使用 RecyclerView但这是第一次发生。我认为最好的解释方式是用照片: 列表不断更新,因此经常调用通知
我知道有很多主题有相同的请求,但我无法为我的应用程序修复后台问题。如果我这样写代码: 我收到错误 Lint:“Possible overdraw: Root element paints the b
我尝试在我的应用程序上运行“调试 GPU 过度绘制”工具以减少过度绘制量。如下图所示,cardview 就像一个额外的 overdraw 层。我没有为我的其他布局提供任何额外的背景颜色或图像。 有办法
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
标准的埃拉托色尼筛多次划掉大多数复合 Material ;事实上,唯一不会被标记多次的就是那些恰好是两个素数的乘积。当然,随着筛子变大, overdraw 也会增加。 对于奇数筛(即没有偶数), ov
我有 Activity ,其中有 TextView ,如下所示:1/9 (holeCounter/holeNm)。我有 2 个 ImageView ,它们在 ImageView 中操作 holeCou
我有 MainActivity 并在 R.id.container 中添加了 2 个 fragment 。 MainActivity 如下所示。 public class MainActivity e
我画了很多半透明的多边形。我的场景是 2D 并使用 2f verticies。我不能使用深度缓冲区,因为它对 alpha 混合没有帮助。有哪些其他技术可以减少 overdraw ,因为这是削弱我的应用
Romain Guy 提到在 Android 4.4/5.0 中引入了自动 overdraw 消除功能(请参阅 http://www.curious-creature.com/2015/03/25/a
我是一名优秀的程序员,十分优秀!