当前位置: 首页 > 知识库问答 >
问题:

添加可隐藏的头视图到回收视图

傅皓君
2023-03-14

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

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

正如你在链接中看到的“你写的是……”pharase仅在用户滚动到顶部时显示。Android sdk中有类似的东西吗?

我怎样才能做到同样的事?

共有1个答案

华良平
2023-03-14

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

主活动的布局,活动_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>

下面是我们填充RecyclerView并使用addOnScrollListener为TextView提供动画的主要活动的代码。请注意注释掉的线条,这些线条将提供默认的淡出或淡入动画,因为上面的xml布局中有注释掉的线条。slideAnimation()方法是创建自定义动画的一个示例。事实证明,该链接对于创建动画非常有用。

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
}

项目显示在回收站视图,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>
 类似资料:
  • 我正在尝试在我的 上实现 ,但我没有得到任何结果。 我遵循了这个教程和这个技巧,但是没有人为我工作。 我已经实现了: 但它不让我编译,因为它们是不同的< code > viewmoder ,因为我创建了两个< code > viewmoder 类,但它们< code >扩展了Recycler。ViewHolder所以我不明白... 我正在尝试这样做,因为我有一个,我希望当列表为空时,它会显示一个,

  • 我已经在我的回收器视图中实现了Admob原生快递广告。它在列表中保留空白,直到广告被加载,如果没有互联网可用。我怎样才能隐藏空白处直到广告加载?谢谢

  • 对不起,我的英语…我会试着解释我想做什么。我有一个项目。它可以在链接上下载: < Li > https://drive . Google . com/file/d/0 bxhio ufkk 3 upcxjngtmvkg 4 tdq/view?usp =共享 正如你看到的截图: http://pixs.ru/showimage/Screenshot_9509352_15647059.png “隐藏/

  • 问题内容: 在iOS 11中,a中的隐藏动画的行为已更改,但是我无法在任何地方找到该文档。 iOS 10 iOS 11 两者中的代码是这样的: 如何在iOS 11上还原以前的行为? 问题答案: 只是有同样的问题。该修复程序将添加到动画块中。您要隐藏的物品的容器在哪里? 不确定为什么这在iOS 11中突然成为一个问题,但公平地说,这一直是推荐的方法。

  • 当我尝试将Image URL解析到ImageView中时,回收器视图不显示,活动为空。我正在使用Picasso将图像加载到适配器类中的onBinfViewHolder方法中。这是相关代码 代表: } RepRvAdapter: } 解析JSON数据的方法: 现在,我有一行解析图像URL的代码被注释掉了。行取消注释后,活动将不再显示。如何获取要在ImageView中解析和显示的图像url?我认为这可

  • 我正在以编程方式将视图添加到: 然而,它们都不知何故是看不见的。返回所有count。每个添加的视图的还返回。 即使我添加新的视图没有拖动,一切都变得可见。