1.回顾
上篇学习了 Android 的手势识别的三种方式;普通识别和 自定义识别;
2.重点
(1)ListView - 下拉刷新
(2)ListView - 底部加载更多
(3)实例:电影列表 (Volley网络通信框架二次开发整合,显示电影列表,下拉刷新,加载更多)
3. 底部加载更多
3.1 基本思路
(1)底部布局实现
(2)初始化布局 添加到 Listview
(3)判断滚动到底部
(4)设置监听:滚动底部 加载数据 并 显示 滚动条
(5)设置回调 函数 :进行数据加载
(6)加载完成 ,隐藏 滚动条
3.2 效果图
3.3 布局实现
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/load_more_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:gravity="center"
android:minHeight="80dp" >
<TextView
android:id="@+id/load_more_tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="查看更多"
android:textColor="@color/white"
android:textSize="20sp" />
<LinearLayout
android:id="@+id/loading_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone" >
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="加载中..."
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</RelativeLayout>
3.4 初始化布局
(1)使用到的变量
//定义总数 item
private int pageItem;
//定义目前的总数 item
private int items;
//footer
private View footer;
//滚动条加载
private LinearLayout loading_layout;
private TextView load_more_tv;
//设置回调函数
private onloadfooterListener footerlistener;
(2) 使用 addFooterView(view) 方法 追加 布局到listview 最后
/初始化 footer
footer=inflate(getContext(),R.layout.footer,null);
//加载布局 实例话
loading_layout=(LinearLayout) footer.findViewById(R.id.loading_layout);
load_more_tv=(TextView) footer.findViewById(R.id.load_more_tv);
//加载进来 ,初始化完毕
addFooterView(footer);
3.5 实现 OnScrolllistener() 监听事件
(1)参数 firstVisiableItem : 第一个 item 的位置
(2)参数 arg2 : 表示当前页 有多少个 item
(3)参数arg3 : 表示最后一个 item 的位置
(4)通过 arg3 = arg2+firstVisiableItem 来判断滑动到底部;
public void onScroll(AbsListView arg0, int firstVisiableItem, int arg2,
int arg3) {
firstItemIndex = firstVisiableItem;
pageItem=firstVisiableItem+arg2;
items=arg3;
Log.i("arg",firstVisiableItem+"");
Log.i("arg",arg2+"");
Log.i("arg",arg3+"");
}
(5)参数 agr1 :表示 当前滑动的状态
public void onScrollStateChanged(AbsListView arg0, int arg1) {
Log.i("state1",arg1+"");
Log.i("state2",MovieListview.SCROLL_STATE_IDLE+"");
//当总数等于滑动的总数时和停止滑动时,到底部
if(pageItem==items && MovieListview.SCROLL_STATE_IDLE==arg1){
//加载数据
//定义接口实现,和刷新一样
footerlistener.onloadfooter();
//设置显示滚动条
loading_layout.setVisibility(View.VISIBLE);
load_more_tv.setVisibility(View.GONE);
}
}
3.6 实现回调函数 和 数据加载完毕的调用
//回调函数
public interface onloadfooterListener{
public void onloadfooter();
}
//通过外面调用
public void setOnloadfooterListener(onloadfooterListener footerlistener){
this.footerlistener=footerlistener;
}
//加载完成 调用 ,关闭
public void onloadfooterComplete(){
loading_layout.setVisibility(View.GONE);
load_more_tv.setVisibility(View.VISIBLE);
}
3.7 调用
(1)实现onloadfooterListener 接口
(2)通过 异步任务进行加载 ,也可以使用 handler 实现
(3)数据加载完毕 ,调用onloadfooterComplete () 方法 ,关闭滚动条
class moveListFooterListener implements onloadfooterListener{
@Override
public void onloadfooter() {
//这里进行 加载数据操作
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
pg++;
if(pg>=4){
pg=1;
}
VolleyHandler<JSONObject> volleyHandler=new VolleyHandler<JSONObject>() {
@Override
public void reqSuccess(JSONObject response) {
// 设置参数
String str="网络错误";
try {
if(response.getString("msg").equals("success")&&response.getInt("code")==1){
//json解析 为 List<shared>
JSONArray array=new JSONArray(response.getString("data"));
for(int i=array.length()-1;i>=0;i--){
JSONObject object=(JSONObject) array.get(i);
shared s=new shared();
s.setId(object.getInt("id"));
s.setName(object.getString("name")+"& 底部加载的");
s.setPic(object.getString("pic"));
s.setTotol(object.getString("totol"));
list.add(list.size(),s);
}
//关闭滚动条
}else{
Show(response.getString("msg"));
}
} catch (JSONException e) {
// 发生异常
Show(e.getMessage());
}
}
@Override
public void reqError(String error) {
Show(error.toString());
}
};
VolleyHttpRequest.JsonObject_Request(VolleyHttpPath.getSharedTwo(pg), volleyHandler);
return null;
}
@Override
protected void onPostExecute(Void result) {
//刷新数据
adapter.notifyDataSetChanged();
//提醒关闭底部滚动条 listview
movie_list.onloadfooterComplete();
}
}.execute();
}
}
4. 下拉刷新
4.1 思路
(1)新建 header 布局
(2)加载布局
(3)实现 onTouchListener() 和 onScrollListener()
(4)在 onTouchListener() 中判断 顶部状态,包括显示顶部布局,隐藏顶部布局
(5)滚动条的显示与隐藏 ,动画效果实现
4.2 效果图
4.3 实现
(1)实现和 底部加载更多 相似 ,可以自己模仿着自己写写,这里就不累赘了;
(2)不过可以参考我的deMo
5. Volley 网络通信框架二次开发
文章地址:
Android-Volley网络通信框架(二次封装数据请求和图片请求(包括处理请求队列和图片缓存))
http://blog.csdn.net/lablenet/article/details/47859613
6.deMo 下载
http://download.csdn.net/detail/lablenet/9063867