在ViewHolder布局之间切换

时间:2018-08-30 04:49:27

标签: android android-recyclerview kotlin recyclerview-layout

我有两个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。我知道我想做的事很奇怪,但这是我的要求。

谢谢!

2 个答案:

答案 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