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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值