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)
谢谢。我会尽力让你知道的。谢谢你给我时间