我有两个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布局(会有淡入/淡出动画效果)在我不需要帮助的两者之间)。我很难按顺序扩大布局。
我尝试了以下操作,并且在两者之间不使用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。我知道我想做的事很奇怪,但这是我的要求。
谢谢!
答案 0 :(得分:0)
您要描述的情况可以通过使用MyViewHolder.post()方法解决。 一般而言,发布会等待MyViewHolder在屏幕上呈现布局 B ,然后稍后再运行发布方法中存在的代码。
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);
}
});
}
关于视图中的发布方法: https://stackoverflow.com/a/13840315/7972699
答案 1 :(得分:0)
我最终使用ViewSwitcher
和一个ViewHolder
来完成此操作。在ViewHolder
中,如果itemView
类型为ViewSwitcher