使用SwipeRefreshLayout和自定义的PullToReFreshListView实现下拉刷新和上拉加载更多

1、布局文件
   
   
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:id="@+id/move_listview_refresh"
android:layout_height="match_parent">
<com.heima.oschina.ui.PullToReFreshListView
android:id="@+id/move_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.heima.oschina.ui.PullToReFreshListView>
 
</android.support.v4.widget.SwipeRefreshLayout>
2、自定义的PullToReFreshListView
   
   
package com.heima.oschina.ui;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
 
import com.heima.oschina.R;
 
public class PullToReFreshListView extends ListView implements OnScrollListener {
 
private View headerView;
private int headermeasuredHeight;
private RotateAnimation up;
private RotateAnimation down;
private int downY;
 
private ImageView mArrow;
private ProgressBar mPb;
private TextView mText;
 
private int footermeasuredHeight;
public View footerview;
/**是否加载更多,true:加载更多,false:没有加载更多**/
private boolean isLoadMore;
 
public PullToReFreshListView(Context context) {
// super(context);
this(context, null);
}
 
public PullToReFreshListView(Context context, AttributeSet attrs) {
// super(context, attrs);
this(context, attrs, 0);
}
 
public PullToReFreshListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
 
// 添加底部条目
addFooter();
// 监听listview的滚动状态
setOnScrollListener(this);
}
 
/**
* 添加listview底部条目 2016-8-14 上午11:34:23
*/
private void addFooter() {
footerview = View.inflate(getContext(), R.layout.footer_item, null);
 
// 隐藏底部条目
footerview.measure(0, 0);
footermeasuredHeight = footerview.getMeasuredHeight();
footerview.setPadding(0, 0, 0, -footermeasuredHeight);
 
addFooterView(footerview);// 添加listview的底部条目
}
 
// 取消刷新
/**
* 取消刷新 2016-8-14 上午11:25:34
*/
public void finish() {
 
//取消加载更多
//因为取消下拉刷新和上拉加载是在一个方法中,为了避免取消下拉刷新的时候,同时也会取消上拉加载,设置是否加载更多的标示
if (isLoadMore) {
footerview.setPadding(0, 0, 0, -footermeasuredHeight);
isLoadMore = false;
}
}
 
// 加载更多
// 1.监听listview的滚动状态,如果是停止滚动,显示加载更多条目,
// 2.上拉到listview的最后一个条目
 
// 当listview滚动状态改变的时候调用的方法
// scrollState : listview滚动的状态
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 监听listview的滚动状态,如果是停止滚动,显示加载更多条目,上拉到listview的最后一个条目
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
&& getLastVisiblePosition() == getCount() - 1 && isLoadMore == false) {
isLoadMore = true;
// 显示加载更多条目
footerview.setPadding(0, 0, 0, 0);
// 重新定位listview显示的最后一个条目
setSelection(getCount() - 1);// 跳转到listview的哪个条目,position : 条目的位置
 
// 加载更多数据
if (onRefreshListener != null) {
onRefreshListener.loadmore();
}
}
}
 
// 当listview滚动的时候调用的方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
 
}
 
// 回调函数实现刷新数据操作
 
// 3.创建保存接口实现对象的变量
public OnRefreshListener onRefreshListener;
 
// 2.创建获取接口实现对象的方法
public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
this.onRefreshListener = onRefreshListener;
}
 
// 1.创建接口
public interface OnRefreshListener {
 
/**加载更多数据**/
public void loadmore();
}
}
3、PullToReFreshListView的布局
    (1)FooterView
         
  
  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>
<ProgressBar
android:id="@+id/pb"
android:layout_width="30dp"
android:layout_height="30dp"
android:indeterminateDrawable="@drawable/progressloading"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加载更多..."
android:textColor="#C4C4C4"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
/>
 
</LinearLayout>
   ListView里面Adapter的布局就不详细写了。大家的需求可能不一样。附一个修改 ProgressBar 图片的drawable,然后修改 android :indeterminateDrawable= "@drawable/progressloading"这个属性就可以了
  
  
<?xml version="1.0" encoding="utf-8"?>
<!--
listView加载效果
Copyright 2012 GitHub Inc.
 
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
 
http://www.apache.org/licenses/LICENSE-2.0
 
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
 
<item>
<rotate
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
<bitmap
android:antialias="true"
android:filter="true"
android:src="@drawable/loading" />
</rotate>
</item>
 
</layer-list>
4、数据加载
   
   
package com.heima.oschina.fragment.move;
 
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
 
import com.heima.oschina.R;
import com.heima.oschina.activity.MoveListDetailsActivity;
import com.heima.oschina.activity.MoveUserCenterActivity;
import com.heima.oschina.adapter.MoveListViewAdapter;
import com.heima.oschina.base.BaseFragment;
import com.heima.oschina.bean.Tweet;
import com.heima.oschina.bean.TweetsList;
import com.heima.oschina.intereface.Url;
import com.heima.oschina.ui.PullToReFreshListView;
import com.heima.oschina.utils.MoveRequestDataUtils;
import com.heima.oschina.utils.XmlUtils;
 
import java.util.ArrayList;
import java.util.TreeMap;
 
/**
* Created by Administrator on 2016/9/16 0016.
*/
public class NewMoveFragment extends BaseFragment {
 
private View view;
private SwipeRefreshLayout refreshLayout;
//private ListView listview;
private int index = 1;
private MoveListViewAdapter adapter;
private PullToReFreshListView listview;
private int maxindex;
 
 
@Override
public Object getContentView() {
//context=getActivity();
view = (View) View.inflate(getActivity(), R.layout.move_listview_pullto, null);
return view;
}
 
@Override
public void initView() {
//初始化控件
refreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.move_listview_refresh_news);
//设置刷新条的颜色
refreshLayout.setColorSchemeColors(Color.RED, Color.YELLOW, Color.BLUE);
listview = (PullToReFreshListView) view.findViewById(R.id.move_listview_pullto);
adapter = new MoveListViewAdapter(null, context);
listview.setAdapter(adapter);
ImageView fail_icon = (ImageView) rootView.findViewById(R.id.fail_image);
fail_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(context,"失败了吧",Toast.LENGTH_SHORT).show();
index=0;
initData();
}
});
//initData();
 
}
 
@Override
public void initData() {
String url = Url.BASEURL + Url.TWEETURL;
//http://192.168.81.39:8080/oschina/list/tweet_list/page0.xml
//String url = "http://www.oschina.net/action/api/tweet_list?uid=0&pageIndex=0&pageSize=20";
//String url =Url.WebUrl+"list/tweet_list/page";
TreeMap<String, String> map = new TreeMap<String, String>();
//map.put("index",index+"");
map.put("uid", 0 + "");
map.put("pageIndex", index + "");
map.put("pageSize", "20");
MoveRequestDataUtils.getNetData(url, map, this);
}
 
@Override
public void initListener() {
//添加刷新头的监听 下拉刷新
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
 
@Override
public void run() {
index = 0; //每次从头开始加载数据
initData();
//adapter.notifyDataSetChanged();
//停止刷新动画
refreshLayout.setRefreshing(false);
}
}, 2000);
 
}
});
//设置滚动到最后一条的监听
listview.setOnRefreshListener(new PullToReFreshListView.OnRefreshListener() {
@Override
public void loadmore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (adapter.getCount() == maxindex) {
TextView textview = (TextView) listview.footerview.findViewById(R.id.text);
ProgressBar pb = (ProgressBar) listview.footerview.findViewById(R.id.pb);
pb.setVisibility(View.GONE);
textview.setTextSize(22);
textview.setText("已加载完成");
return;
}
index++;
initData();
listview.finish();
}
}, 2000);
}
});
//当listView条目被点击的时候跳转
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Tweet info = (Tweet) parent.getItemAtPosition(position);
if (info != null) {
int detailid = info.getId();
Log.e("id", detailid + "");
Intent intent = new Intent(context, MoveListDetailsActivity.class);
intent.putExtra("ID", detailid);
context.startActivity(intent);
}
}
});
}
 
@Override
public CharSequence getTitle() {
return "最新动弹";
}
 
//加载返回的数据
@Override
public void onRequestFinish(byte[] bytes) {
 
TweetsList info = XmlUtils.toBean(TweetsList.class, bytes);
System.out.println(info==null);
if (info != null) {
showView(true);
ArrayList<Tweet> list = (ArrayList<Tweet>) info.getList();
maxindex = info.getTweetCount();
if (adapter != null) {
if (index == 0 && adapter.getData().size() != 0) {
adapter.getData().clear();
adapter.getData().addAll(list);
adapter.notifyDataSetChanged();
} else {
//adapter.getData().clear();
adapter.getData().addAll(list);
adapter.notifyDataSetChanged();
}
} else {
adapter = new MoveListViewAdapter(list,context);
}
} else {
showView(false);
}
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值