Android 打开布局并在项目下方移动

Android 打开布局并在项目下方移动,android,material-design,Android,Material Design,如何实现以下功能。我有一张回收清单。当我单击下面的项目时,单击的项目将显示说明。但同时,列表中的项目必须向下移动,以使其位于打开的描述下方。对于这种情况,您需要使用多个视图持有者,每个视图持有者都有自己的布局: data class Item( title: String, description: String, showDescription: Boolean = false ) open class TitleViewHolder( itemView:

如何实现以下功能。我有一张回收清单。当我单击下面的项目时,单击的项目将显示说明。但同时,列表中的项目必须向下移动,以使其位于打开的描述下方。

对于这种情况,您需要使用多个视图持有者,每个视图持有者都有自己的布局:

data class Item(
    title: String, 
    description: String, 
    showDescription: Boolean = false
)

open class TitleViewHolder(
    itemView: View,
    onClicked: (Int) -> Unit
) : RecyclerView.ViewHolder(itemView) {

    private val titleView: TextView = itemView.findViewById(R.id.title)

    init {
        itemView.setOnClickListener { 
            if (adapterPosition != RecyclerView.NO_POSITION)
                onClicked(adapterPosition)
        }
    }

    fun bindTo(item: Item) {
        titleView.text = item.title
        onBind(item)
    }

    protected open fun onBind(item: Item) {
        // Do nothing
    }

}

class TitleAndDescriptionViewHolder(
    itemView: View,
    onClicked: (Int) -> Unit
) : TitleViewHolder(itemView) {
    private val description: TextView = itemView.findViewById(R.id.description)

    override fun onBind(item: Item) {
        description.text = item.description
    }
}

override fun getItemViewType(position: Int) = if (items[position].showDescription)
    R.layout.item_with_description else R.layout.item_with_title

override fun createViewHolder(...) {
    val view = LayoutInflater.from(...).inflate(viewType, parent, false)

    // Note: This presentation logic can be easily extracted, utilizing a
    // Lambda passed to the adapter which takes (Item) and returns Unit.
    // You'd then need a `setList` method which uses `DiffUtil` to update the
    // List but the result should be the same.
    val onClick: (Int) -> Unit = {
        val dataItem = data[it]
        val newItem = dataItem.copy(showDescription = !dataItem.showDescription)
        data[it] = newItem
        notifyItemChanged(it)
    }

    return when (viewType) {
        R.layout.item_with_description -> TitleAndDescriptionViewHolder(view)
        R.layout.item_with_title -> TitleViewHolder(view)
    }
}

override fun bindViewHolder(holder, position) {
    holder.bindTo(data[position])
}
单击某个项目时,将更新其
showDescription
标志,并通知适配器该位置发生了更改。这将触发构建新项目、执行适当的动画等操作。

按照链接进行操作

然后点击克隆或下载按钮下载 您可以使用git

下载后,将其解压缩,并将折叠单元文件夹从解压缩文件夹复制到项目文件夹中 我的意思是,你必须把折叠单元平行于应用程序文件夹

一旦你这样做了,就转到你的android studio并进行以下更改:

打开settings.gradle 文件看起来像这样

include ':app'
您必须将其更新为以下内容:

include ':app'
    ':folding-cell'
然后打开你的app build.gradle文件 并将以下行添加到dependencies部分

implementation project(':folding-cell')
完成后,只需同步项目 构建完成后,您将得到与之前相同的错误

因此,现在您必须打开folding cell build.gradle文件并将androidx库更新为android

只需将整个文件更新到这个位置

    apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    implementation 'com.android.support:appcompat-v7:28.0.0'

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:2.22.0'
}
现在再次构建项目

一切正常


如果你面临任何问题,让我知道

看看这个库,它会有帮助的。列表在这里意味着什么?列表视图还是内容?好吧,如果是内容,那么如果你切换内容的可见性,它就会工作,否则使用以下布局,或者这个布局也很好@HarKal yes。像这样的。有没有一种方法可以在没有第三方库的情况下用原生方式实现它?@Mr.Patel类似这样的东西。有没有一种方法可以在没有第三方库的情况下用原生方式实现它?要用原生方式实现,请查看此链接,谢谢。但基本上,它不是一个新的项目,而是同一个项目的扩展。它是同一个基础项目。我们所做的只是替换显示它的视图。是否有特定的原因需要相同的视图实例?据我记忆所及,在RecyclerView中重新测量视图可能很棘手。我正在传递对象以将其数据放入单元格中。因此,我想它应该是同一个项,以使它与同一个对象一起工作。我将使用包装器类型,并将其用于我的适配器:
data-class-ItemWrapper(item:OriginalItem,showDescription:Boolean)
谢谢。我会尽力让你知道的。谢谢你给我时间