android - 将可隐藏的标题 View 添加到 recyclerview

标签 android android-recyclerview

我想添加一个 headerview,当用户向下滚动时隐藏,当用户向上滚动时再次显示。

示例:https://imgur.com/a/tTq70B0

正如您在链接“您正在写为...”中看到的那样,短语仅在用户滚动到顶部时显示。 Android sdk中有类似的东西吗?

我怎样才能达到同样的目的?

最佳答案

获取滚动事件只是实现这一目标的第一步。需要动画才能达到效果。我重新创建了您发布的 gif 示例的简单版本。

Example

主要 Activity 的布局,activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:animateLayoutChanges="true"> <!-- Note the last line-->

    <TextView
        android:id="@+id/textview_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="8dp"
        android:text="Hello Stack Overflow!"/>


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

下面是主要 Activity 的代码,我们在其中填充 RecyclerView 并使用 addOnScrollListener 为 TextView 提供动画。请注意注释掉的行,由于上面 xml 布局中的 noted 行,这些行将提供默认的淡出或淡入动画。方法 slideAnimation() 是创建自定义动画的示例。此链接证明useful用于创建动画。

class MainActivity : AppCompatActivity() {
    private lateinit var viewAdapter: RecyclerView.Adapter<*>
    private lateinit var viewManager: LinearLayoutManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Some data for the RecyclerView
        val data: List<String> = (1..100).toList().map { it.toString() }

        viewManager = LinearLayoutManager(this)
        viewAdapter = TextAdapter(data)

        findViewById<RecyclerView>(R.id.recyclerview_main).apply {
            setHasFixedSize(true)
            layoutManager = viewManager
            adapter = viewAdapter

            addOnScrollListener(
                object : RecyclerView.OnScrollListener() {
                    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                        super.onScrolled(recyclerView, dx, dy)

                        val pastVisibleItems = viewManager.findFirstCompletelyVisibleItemPosition()
                        if (pastVisibleItems == 0) {
                            slideAnimation(0f, 1f, View.VISIBLE)
                            //textview_hello.visibility = View.VISIBLE
                        } else if (textview_hello.visibility != View.GONE) {
                            slideAnimation(-150f, 0f, View.GONE)
                            //textview_hello.visibility = View.GONE
                        }
                    }
                }
            )
        }

    ... // SlideAnimation function

    }

}

slideAnimation函数

private fun slideAnimation(translationY: Float, alpha: Float, viewVisibility: Int) {
    textview_hello.visibility = View.VISIBLE
    textview_hello.clearAnimation()
    textview_hello
        .animate()
        .translationY(translationY)
        .alpha(alpha)
        .setListener(object : AnimatorListenerAdapter() {
            override fun onAnimationEnd(animation: Animator) {
                super.onAnimationEnd(animation)
                textview_hello.clearAnimation()
                textview_hello.visibility = viewVisibility
            }
        })
        .duration = 500
}

RecycleView 的适配器:

class TextAdapter(private val textList: List<String>) :
    RecyclerView.Adapter<TextAdapter.TextViewHolder>() {

    class TextViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): TextViewHolder {
        val textView = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_text_view, parent, false) as TextView
        return TextViewHolder(textView)
    }

    override fun onBindViewHolder(holder: TextViewHolder, position: Int) {
        holder.textView.text = textList[position]
    }

    override fun getItemCount() = textList.size
}

要在 RecyclerView 中显示的项目,item_text_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:layout_margin="8dp"
    android:padding="16dp"
    android:textAlignment="center"
    android:background="@android:color/darker_gray">

</TextView>

关于android - 将可隐藏的标题 View 添加到 recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943309/

相关文章:

android - 是否可以使用 Gradle(不是产品风格)将 AndroidManifest 添加到特定的 buildType?

android - 找不到用于签名配置的 keystore 文件 D\Telegram-master\TMessagesProj\config\release.keystore 'debug'

java - 如何在android的Recyclerview中添加点赞按钮

android - 无法将 Android Studio 与 Firebase 链接/连接

java - 无法编辑 mp3 标签

android - 通知 onSwiped 方法列表在 mainActivity 中排序

android - RecyclerView 适配器显示错误的图像

java - 如何更改回收 View 元素的颜色?

android - 如何在对 recyclerview 项目执行单击时更新 viewModel 的实时数据

android - SQLite 中 LEAD 和 LAG 的替代品