1.首先重写listview,给其加上底部的view
public class ListView_foot extends ListView implements AbsListView.OnScrollListener{
private int state;//状态值
/**
* 自己定义的两个状态,加载状态LOADING,和加载完后的状态GONE
*/
private final int LOADING=1;
private final int GONE=2;
private View footView;//所加在listview下面的view
private boolean isRemark;
private int sumItem;//页面显示的第一个item数加上这页item数量
private int totalItem;//listview总的item数
IReFlashListener iReFlashListener;
//重写的构造方法
public ListView_foot(Context context) {
super(context);
FootView(context);
}
public ListView_foot(Context context, AttributeSet attrs) {
super(context, attrs);
FootView(context);
}
public ListView_foot(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
FootView(context);
}
@Override
if(!isRemark){
isRemark=true;
state=LOADING;
ViewChangedByState(state);
iReFlashListener.onReFlash();//这里是刷新数据的关键
}
}
}
//监听频幕滚动生成的方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
sumItem=firstVisibleItem+visibleItemCount;
totalItem=totalItemCount;
}
private void FootView(Context context){
LayoutInflater inflater= LayoutInflater.from(context);
//想加什么样的底部可以自己布局
footView=inflater.inflate(R.layout.foot_layout,null);
this.addFooterView(footView);//将footView加到listView的底部
}
private void ViewChangedByState(int state){
switch (state){
case LOADING:
//这个状态下 footview显示
this.footView.setVisibility(View.VISIBLE);
this.footView.setPadding(0, 0, 0, 0);
break;
case GONE:
//这个状态下 footview隐藏
this.footView.setVisibility(View.GONE);
//将隐藏的footView向下移动footView.getHeight()的距离
this.footView.setPadding(0, -footView.getHeight(), 0, 0);
break;
}
}
//加载完后调用的方法
public void refreshComplete(){
state=GONE;
ViewChangedByState(state);
}
public void setInterface(IReFlashListener iReFlashListener){
this.iReFlashListener=iReFlashListener;
}
/**
* 刷新数据的接口
*/
public interface IReFlashListener{
public void onReFlash();
}
}
2.在自己的所需的Activity里面调用
public class MainActivity extends Activity implements ListView_foot.IReFlashListener{
private ListView_foot listView;//注意这里是导入的重写的listview
private SimpleAdapter simpleAdapter;
private List<Map<String,Object>>dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView_foot)findViewById(R.id.listView);
dataList=new ArrayList<Map<String,Object>>();
listView.setInterface(this);
for(int i=0;i<40;i++){
Map<String,Object>map=new HashMap<>();
map.put("number",""+1);
map.put("hello","hello world");
dataList.add(map);
}
simpleAdapter=new SimpleAdapter(this,dataList,R.layout.item,new String[]{"number","hello"},
new int[]{R.id.text1,R.id.text2});
listView.setAdapter(simpleAdapter);
}
@Override
public void onReFlash() {
/**
* 这里进行加载数据的对应操作
* 加载完后,调用refreshComplete()方法
*/
for(int i=0;i<3;i++){
Map<String,Object>map=new HashMap<>();
map.put("number",""+2);
map.put("hello", "hello world");
dataList.add(map);
}
//datalist改变后,使其在界面显示出来
simpleAdapter.notifyDataSetChanged();
listView.refreshComplete();
}
}
3.注意一下listview所在的XML文件里面
<com.example.user.myli.ListView_foot
<----这里是重写的listview所在的包加上重写的名---->
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listView"
/>
由于所写的小demo没有从网上取数据,获得数据的时间太短,会造成你看不到listview下面
的加载view,但真正涉及到网络的时候,是会显示的,亲测!!!
public class ListView_foot extends ListView implements AbsListView.OnScrollListener{
private int state;//状态值
/**
* 自己定义的两个状态,加载状态LOADING,和加载完后的状态GONE
*/
private final int LOADING=1;
private final int GONE=2;
private View footView;//所加在listview下面的view
private boolean isRemark;
private int sumItem;//页面显示的第一个item数加上这页item数量
private int totalItem;//listview总的item数
IReFlashListener iReFlashListener;
//重写的构造方法
public ListView_foot(Context context) {
super(context);
FootView(context);
}
public ListView_foot(Context context, AttributeSet attrs) {
super(context, attrs);
FootView(context);
}
public ListView_foot(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
FootView(context);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//这里表示滑到底部的时候且屏幕停止滚动
if(totalItem==sumItem && scrollState==SCROLL_STATE_IDLE){if(!isRemark){
isRemark=true;
state=LOADING;
ViewChangedByState(state);
iReFlashListener.onReFlash();//这里是刷新数据的关键
}
}
}
//监听频幕滚动生成的方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
sumItem=firstVisibleItem+visibleItemCount;
totalItem=totalItemCount;
}
private void FootView(Context context){
LayoutInflater inflater= LayoutInflater.from(context);
//想加什么样的底部可以自己布局
footView=inflater.inflate(R.layout.foot_layout,null);
this.addFooterView(footView);//将footView加到listView的底部
}
private void ViewChangedByState(int state){
switch (state){
case LOADING:
//这个状态下 footview显示
this.footView.setVisibility(View.VISIBLE);
this.footView.setPadding(0, 0, 0, 0);
break;
case GONE:
//这个状态下 footview隐藏
this.footView.setVisibility(View.GONE);
//将隐藏的footView向下移动footView.getHeight()的距离
this.footView.setPadding(0, -footView.getHeight(), 0, 0);
break;
}
}
//加载完后调用的方法
public void refreshComplete(){
state=GONE;
ViewChangedByState(state);
}
public void setInterface(IReFlashListener iReFlashListener){
this.iReFlashListener=iReFlashListener;
}
/**
* 刷新数据的接口
*/
public interface IReFlashListener{
public void onReFlash();
}
}
2.在自己的所需的Activity里面调用
public class MainActivity extends Activity implements ListView_foot.IReFlashListener{
private ListView_foot listView;//注意这里是导入的重写的listview
private SimpleAdapter simpleAdapter;
private List<Map<String,Object>>dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView_foot)findViewById(R.id.listView);
dataList=new ArrayList<Map<String,Object>>();
listView.setInterface(this);
for(int i=0;i<40;i++){
Map<String,Object>map=new HashMap<>();
map.put("number",""+1);
map.put("hello","hello world");
dataList.add(map);
}
simpleAdapter=new SimpleAdapter(this,dataList,R.layout.item,new String[]{"number","hello"},
new int[]{R.id.text1,R.id.text2});
listView.setAdapter(simpleAdapter);
}
@Override
public void onReFlash() {
/**
* 这里进行加载数据的对应操作
* 加载完后,调用refreshComplete()方法
*/
for(int i=0;i<3;i++){
Map<String,Object>map=new HashMap<>();
map.put("number",""+2);
map.put("hello", "hello world");
dataList.add(map);
}
//datalist改变后,使其在界面显示出来
simpleAdapter.notifyDataSetChanged();
listView.refreshComplete();
}
}
3.注意一下listview所在的XML文件里面
<com.example.user.myli.ListView_foot
<----这里是重写的listview所在的包加上重写的名---->
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listView"
/>
由于所写的小demo没有从网上取数据,获得数据的时间太短,会造成你看不到listview下面
的加载view,但真正涉及到网络的时候,是会显示的,亲测!!!