项目中要实现Listview中的第一行向上滑动的过程中,随着向上滑动,用户永远可以看到第一行悬浮在屏幕上方。
实现这种效果,主要是监听listview 的滑动事件判断当第一行滑出屏幕后,如何显示第一行的问题。当第一行滑出屏幕后,用户看到的其实是另外一个布局,原来的listview的第一行,其实随着滚动,用户已经看不见了。
1.整个页面的代码布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cube_ptr="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<!--使用的是开源的下拉刷新框架 --> <in.srain.cube.views.ptr.PtrClassicFrameLayout android:id="@+id/rotate_header_list_view_frame" android:layout_width="match_parent" android:layout_height="match_parent" cube_ptr:ptr_duration_to_close="200" cube_ptr:ptr_duration_to_close_header="1000" cube_ptr:ptr_keep_header_when_refresh="true" cube_ptr:ptr_pull_to_fresh="false" cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2" cube_ptr:ptr_resistance="1.7"> <com.esky.echat.common.widget.ultrapulltorefresh.UltraRefreshListView android:id="@+id/rotate_header_list_view" style="@style/listview_style" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" android:fadingEdge="none" android:scrollbarStyle="outsideOverlay" /> </in.srain.cube.views.ptr.PtrClassicFrameLayout> </LinearLayout> <include layout="@layout/fragment_base_empty"></include> <!--用户看到的悬浮在屏幕上方的布局,与listview 第一行布局一致 --> <include layout="@layout/listitem_livevideo_contribution_first" android:visibility="gone"></include> </RelativeLayout>
2.监听滑动事件
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.e(TAG, "firstVisibleItem = " + firstVisibleItem); if (firstVisibleItem >= 1) { hideLayout.setVisibility(View.VISIBLE); Log.e(TAG, "hideView.setVisibility(View.VISIBLE) "); } else { hideLayout.setVisibility(View.GONE); Log.e(TAG, "hideView.setVisibility(View.GONE) "); } }
上面使用的是 firstVisibleItem >= 1 来进行显示的。 如果 使用firstVisibleItem >= 0,那么在页面一开始显示的情况下,额外的悬浮布局就显示了,那么在滑动的过程中,明显的会看到两个同样的item。为了避免这种情况,mListView.addHeaderView(headView) ,而headview 可以是一个1px的透明布局。 现在看起来是不是很简单了。