在Android的应用程序中,使用列表来展示内容的应用是最多的。当然,我们从早期的ListView到目前的RecyclerView,列表控件的实现更加的优秀。但无论怎样,我们都会在使用列表控件的时候添加下拉刷新和上拉加载更多。这的效果有多种实现当然也会针对ListView与RecyclerView有着对应的实现,本篇我首先以ListView来实现一下对于下拉刷新和上拉加载更多的效果。
本篇的效果是通过对ListView进行添加脚布局的方式来实现的。主要就是对于ListView的滑动效果的监听,在不同的时机显示或隐藏脚布局。
本篇主要是上拉加载更多的实现。
1.在layout目录下添加脚布局文件listview_layout.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/footer_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:gravity="center"
>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleSmall"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载..."
/>
LinearLayout>
LinearLayout>
2.在view的包中新建类LoadListView继承自ListView。在类中定义添加布局的方法并在每一个构造方法中调用,从而保证在初始化的时候就为ListView添加布局。
public LoadListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
addView(context);
}
public LoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
addView(context);
}
public LoadListView(Context context) {
super(context);
addView(context);
}
3.将xml文件中的布局加载并初始化,然后为ListView添加脚布局。
footerView=LayoutInflater.from(context).inflate(R.layout.listview_footer, null);
this.addFooterView(footerView);
由于我们在刚刚打开应用界面的时候没有滑动,所以默认情况下的ListView的脚布局是隐藏的,我们现在让自定义的ListView实现滚动监听的接口,让滚动事件交给控件自己处理。
this.footerView.findViewById(R.id.footer_layout).setVisibility(View.GONE)
// 初始化的同时就设置上滚动的监听
this.setOnScrollListener(this);
4.当然为了真正监听滚动事件从而在不同的时机显示或隐藏头布局与脚布局,要在接口的未实现方法上做文章。
/*
* (non-Javadoc)
* @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.
* AbsListView, int, int, int) 1:这个ListView控件 2:第一个可见的item位置 3:可见的item的数量
* 4:总的item数量
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//记录下最后一个可见的条目的位置,通过判断最后一个可见条目的位置是否等于总的条目的数量来判断是否加载到最后一个条目A
this.lastVisibility=firstVisibleItem+visibleItemCount;
this.itemCount=totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//判断当前的可见的最后一个item就是最后一个item了,并且此时的状态是静止的
if(itemCount==lastVisibility&&scrollState==SCROLL_STATE_IDLE){
if(!isLoading){
isLoading=true;
footerView.findViewById(R.id.footer_layout).setVisibility(View.VISIBLE);
//通过接口回调的方式来实现加载更多数据的展示效果
listener.onLoad();
}
}
}
5.通过接口回调的方式来进行当出现加载条目的时候的动作。
@Override
public void onLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i=1;i <= 10; i++) {
lists.add(new String("这是第" + i + "个条目"));
}
mAdapter.notifyDataSetChanged();
listView.loadComplete();
}
}, 3000);
}