3 向滚动 Android

3 way scroll in Android

我有 3 个视图:一个 ImageView、一个 RelativeLayout 和一个 ListView。当用户向下滚动时,我必须先隐藏 ImageView 。当 RelativeLayout 的顶部接触到屏幕顶部时,它必须将自己固定在那里,并且滚动必须由 ListView 完成。然后当我向上滚动时,ListView 的顶部必须在 ImageView 开始再次向下滚动之前可见。

是否有任何组件可以满足我的需求而无需编写我自己的组件?

(为了让事情更简单,它应该像 Instagram 中的 header 一样工作,当 header 到达顶部时它会停留在那里,但应该只有一个 header)

我有一个非常简单的解决方案,希望对您有所帮助。我使用一个 header 添加到 listView 并将相同的 header 添加到顶部的页面。有一个侦听器可以切换固定 header 的可见性。一切都在onCreate方法中完成:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.list);

    LayoutInflater inflater = getLayoutInflater();
    // your image header
    View headerImage = inflater.inflate(R.layout.header_image, listView, false);
    listView.addHeaderView(headerImage);
    // the header that scrolls with the listview
    final View fixedHeader = inflater.inflate(R.layout.header_fixed, listView, false);
    listView.addHeaderView(fixedHeader);

    // the header that is fixed on top of the screen
    final View secondFixedHeader = findViewById(R.id.fixed_header);
    secondFixedHeader.setVisibility(View.GONE);

    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem > 0) {
                secondFixedHeader.setVisibility(View.VISIBLE);
            } else {
                secondFixedHeader.setVisibility(View.GONE);
            }
        }
    });

    listView.setAdapter(new ListAdapter(this));
}

有 activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <include
        android:id="@+id/fixed_header"
        layout="@layout/header_fixed" />

</RelativeLayout>

有 header_fixed.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:background="@android:color/darker_gray">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a fixed header"
        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large"/>

</RelativeLayout>

还有 header_image.xml:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/android"/>