我有3个视图:一个ImageView
,一个RelativeLayout
和一个ListView
。当用户向下滚动时,我必须先隐藏ImageView
。当RelativeLayout
的顶部接触屏幕顶部时,它必须将自己固定在那里,并且滚动必须由ListView
完成。然后,当我向上滚动时,ListView
的顶部必须可见,然后ImageView
再次开始向下滚动。
是否有任何组件可以执行我想要的操作,而无需编写自己的组件?
(只是为了让事情变得更容易,它应该像 Instagram 中的标题一样工作,当标题到达顶部时它会留在那里,但应该只有一个标题)
我有一个非常简单的解决方案,希望对您有所帮助。我使用一个添加到列表视图的标题和添加到顶部页面的相同标题。有一个侦听器可以切换固定标头的可见性。一切都在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"/>