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"/>
我有 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"/>