ViewHolder 视图 flash/blink OnBind
ViewHolder views flash/blink OnBind
问题
每次我在 holder 中调用 OnBind() 方法时,它们中的视图会闪烁或闪烁甚至可能会消失。
我完全不知道为什么,我已经尝试了很多方法。
- 将它们更改为空背景或全部为纯色。
- 确保任何时候都没有丢失任何东西。
- 删除了所有动画。
- 问Google一千次,一千种方法。
- 在此处搜索。
想法
我一直认为我最终必须尝试用动画和样式隐藏它。将其视为绑定的副作用。
显然,这是一个更大项目的一部分。所以我仍然必须做所有的动画,这就是为什么我还没有为此做的原因。我想我只是问一下,看看是否有人可以在此期间帮助找到另一种解决方案。
任何帮助、提示或建议都将非常有用。希望代码链接有效并且可以为每个人构建。
谢谢,
乔恩
代码
我不确定我需要在此处添加多少代码,所以我先从小的开始。如果要添加更多内容,请告诉我,我会的。但是我把它全部放在 Github 和 Dropbox(示例 Apk 和 Zip)上。
链接在底部。
HeaderHolder.java
public class HeaderHolder extends BaseHolder {
@Bind(R.id.header_title_text)
TextView _titleTextView;
@Bind(R.id.header_status_image)
ImageView _statusImageView;
@BindDrawable(R.drawable.ic_selected)
Drawable _statusSelected;
@BindDrawable(R.drawable.ic_non_selected)
Drawable _statusNonselected;
private Header _header;
public HeaderHolder(View root, HolderCallBacks callbacks) {
super(null, root, callbacks);
}
@Override
public void OnBind(Base model) {
this._header = (Header) model;
String n = model._name();
this._titleTextView.setText(n);
this._statusImageView.setImageDrawable(this._header._iconset()._selected()
? this._statusSelected : this._statusNonselected);
}
@OnClick(R.id.header_item_wrapper)
public void _headerClick(View view) {
this._callbacks.OnHolderClick(view, this._header);
}
}
IconsetHolder.java
public class IconsetHolder extends BaseHolder {
@Bind(R.id.iconset_icon_recycler)
RecyclerView _iconsRecycler;
private AdapterCallBacks _adapterCallbacks;
public IconsetHolder(Context context, View root, AdapterCallBacks callbacks) {
super(context, root, null);
this._adapterCallbacks = callbacks;
}
@Override
public void OnBind(Base model) {
Iconset i = (Iconset) model;
this._iconsRecycler.setLayoutManager(new GridLayoutManager(
this._context, i._span(), GridLayoutManager.HORIZONTAL, false));
this._iconsRecycler.setAdapter(new ModelsAdapter(i._icons(), this._adapterCallbacks));
}
}
item_header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header_item_wrapper"
android:layout_width="wrap_content"
android:layout_height="56dip"
android:background="#595959"
tools:context=".views.adapters.holders.HeaderHolder">
<TextView
android:id="@+id/header_title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:textColor="#fff8f8f8"
android:gravity="center_vertical"
android:text="ICONSET"
android:textSize="24sp"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/header_status_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:gravity="center_vertical"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
item_iconset.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/iconset_item_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
tools:context=".views.adapters.holders.IconsetHolder">
<android.support.v7.widget.RecyclerView
android:id="@+id/iconset_icon_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:background="#595959"
android:layout_marginBottom="16dp"
/>
</RelativeLayout>
示例链接已删除
RecyclerView
使用 DefaultItemAnimator 有一些内置动画。具体来说,当您调用 notifiyItemChanged()
时,它会为 ViewHolder
中的数据更改执行淡入淡出动画。如果您想禁用它,您可以使用以下命令:
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); // your recycler view here
if (animator instanceof DefaultItemAnimator) {
((DefaultItemAnimator) animator).setSupportsChangeAnimations(false);
}
这将禁用项目更改动画(您看到的淡入淡出)。
问题
每次我在 holder 中调用 OnBind() 方法时,它们中的视图会闪烁或闪烁甚至可能会消失。
我完全不知道为什么,我已经尝试了很多方法。
- 将它们更改为空背景或全部为纯色。
- 确保任何时候都没有丢失任何东西。
- 删除了所有动画。
- 问Google一千次,一千种方法。
- 在此处搜索。
想法
我一直认为我最终必须尝试用动画和样式隐藏它。将其视为绑定的副作用。
显然,这是一个更大项目的一部分。所以我仍然必须做所有的动画,这就是为什么我还没有为此做的原因。我想我只是问一下,看看是否有人可以在此期间帮助找到另一种解决方案。
任何帮助、提示或建议都将非常有用。希望代码链接有效并且可以为每个人构建。
谢谢,
乔恩
代码
我不确定我需要在此处添加多少代码,所以我先从小的开始。如果要添加更多内容,请告诉我,我会的。但是我把它全部放在 Github 和 Dropbox(示例 Apk 和 Zip)上。
链接在底部。
HeaderHolder.java
public class HeaderHolder extends BaseHolder {
@Bind(R.id.header_title_text)
TextView _titleTextView;
@Bind(R.id.header_status_image)
ImageView _statusImageView;
@BindDrawable(R.drawable.ic_selected)
Drawable _statusSelected;
@BindDrawable(R.drawable.ic_non_selected)
Drawable _statusNonselected;
private Header _header;
public HeaderHolder(View root, HolderCallBacks callbacks) {
super(null, root, callbacks);
}
@Override
public void OnBind(Base model) {
this._header = (Header) model;
String n = model._name();
this._titleTextView.setText(n);
this._statusImageView.setImageDrawable(this._header._iconset()._selected()
? this._statusSelected : this._statusNonselected);
}
@OnClick(R.id.header_item_wrapper)
public void _headerClick(View view) {
this._callbacks.OnHolderClick(view, this._header);
}
}
IconsetHolder.java
public class IconsetHolder extends BaseHolder {
@Bind(R.id.iconset_icon_recycler)
RecyclerView _iconsRecycler;
private AdapterCallBacks _adapterCallbacks;
public IconsetHolder(Context context, View root, AdapterCallBacks callbacks) {
super(context, root, null);
this._adapterCallbacks = callbacks;
}
@Override
public void OnBind(Base model) {
Iconset i = (Iconset) model;
this._iconsRecycler.setLayoutManager(new GridLayoutManager(
this._context, i._span(), GridLayoutManager.HORIZONTAL, false));
this._iconsRecycler.setAdapter(new ModelsAdapter(i._icons(), this._adapterCallbacks));
}
}
item_header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header_item_wrapper"
android:layout_width="wrap_content"
android:layout_height="56dip"
android:background="#595959"
tools:context=".views.adapters.holders.HeaderHolder">
<TextView
android:id="@+id/header_title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:textColor="#fff8f8f8"
android:gravity="center_vertical"
android:text="ICONSET"
android:textSize="24sp"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/header_status_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:gravity="center_vertical"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
item_iconset.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/iconset_item_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
tools:context=".views.adapters.holders.IconsetHolder">
<android.support.v7.widget.RecyclerView
android:id="@+id/iconset_icon_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:background="#595959"
android:layout_marginBottom="16dp"
/>
</RelativeLayout>
示例链接已删除
RecyclerView
使用 DefaultItemAnimator 有一些内置动画。具体来说,当您调用 notifiyItemChanged()
时,它会为 ViewHolder
中的数据更改执行淡入淡出动画。如果您想禁用它,您可以使用以下命令:
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); // your recycler view here
if (animator instanceof DefaultItemAnimator) {
((DefaultItemAnimator) animator).setSupportsChangeAnimations(false);
}
这将禁用项目更改动画(您看到的淡入淡出)。