您的位置:首页 > 移动开发 > Android开发

Android-Listview(下拉刷新,底部加载更多,电影列表实例)

2015-08-31 00:39 561 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息