在 ViewHolder 布局之间切换
Switching between ViewHolder layouts
我有两个 ViewHolder
有两个不同的布局文件。我想做的是为给定的 ViewHolder
膨胀一个布局,然后在一秒钟后,用不同的布局重新膨胀它。
这是一些代码:
class MyAdapter(context: Context,
myList: List<MyUiModel> = emptyList(),
private val clickListener: MyListener)
: RecyclerView.ViewHolder(context, myList) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return when (viewType) {
TYPE_A ->
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener)
else -> MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
}
}
所以,每当我需要实例化 TypeAViewHolder
时,我都需要先膨胀 type_a 布局,然后我想膨胀 type_b 布局,这将取代 type_a 布局(两者之间会有淡出 in/fade 动画,我不需要帮助)。我很难按顺序膨胀布局。
我尝试了以下有无 Thread.sleep(1000L)
的方法。
TYPE_A -> {
MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener)
}
但是当我将日志语句添加到我的 ViewHolder
时,只有列出的最后一个 (TypeAViewHolder
) 被绑定到。
P.S。我知道我想做的事情很奇怪,但这是我的要求。
提前致谢!
您描述的情况可以使用MyViewHolder.post()方法解决。
通常 post 将等待 MyViewHolder 在屏幕上呈现布局 B,然后 运行 稍后在 post 方法中存在的代码。
TYPE_A -> {
MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
MyViewHolder.post(new Runnable() {
@Override
public void run() {
// if you want a delay use Thread.sleep(1000L) here
Thread.sleep(1000L);
//to inflate view after layout B is inflated and waited for 1sec
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener);
}
});
}
关于post方法在视图中:
我最终使用 ViewSwitcher
和一个 ViewHolder
来完成这个。在 ViewHolder
中,如果 itemView
是 ViewSwitcher
类型,我会以不同的方式处理它
我有两个 ViewHolder
有两个不同的布局文件。我想做的是为给定的 ViewHolder
膨胀一个布局,然后在一秒钟后,用不同的布局重新膨胀它。
这是一些代码:
class MyAdapter(context: Context,
myList: List<MyUiModel> = emptyList(),
private val clickListener: MyListener)
: RecyclerView.ViewHolder(context, myList) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return when (viewType) {
TYPE_A ->
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener)
else -> MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
}
}
所以,每当我需要实例化 TypeAViewHolder
时,我都需要先膨胀 type_a 布局,然后我想膨胀 type_b 布局,这将取代 type_a 布局(两者之间会有淡出 in/fade 动画,我不需要帮助)。我很难按顺序膨胀布局。
我尝试了以下有无 Thread.sleep(1000L)
的方法。
TYPE_A -> {
MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener)
}
但是当我将日志语句添加到我的 ViewHolder
时,只有列出的最后一个 (TypeAViewHolder
) 被绑定到。
P.S。我知道我想做的事情很奇怪,但这是我的要求。
提前致谢!
您描述的情况可以使用MyViewHolder.post()方法解决。 通常 post 将等待 MyViewHolder 在屏幕上呈现布局 B,然后 运行 稍后在 post 方法中存在的代码。
TYPE_A -> {
MyViewHolder.TypeBViewHolder(
layoutInflater.inflate(R.layout.type_b, parent, false), clickListener)
MyViewHolder.post(new Runnable() {
@Override
public void run() {
// if you want a delay use Thread.sleep(1000L) here
Thread.sleep(1000L);
//to inflate view after layout B is inflated and waited for 1sec
MyViewHolder.TypeAViewHolder(
layoutInflater.inflate(R.layout.type_a, parent, false), clickListener);
}
});
}
关于post方法在视图中:
我最终使用 ViewSwitcher
和一个 ViewHolder
来完成这个。在 ViewHolder
中,如果 itemView
是 ViewSwitcher