在现在app的listview中,我们可以看到很多数据下拉到底部,会出现正在加载的效果,然后再更新数据,最近自己也琢磨做一个,感觉其实还是很简单的,下面就是代码实现。
1.重写listview。
我们要自定义一个listview来实现这些功能,下面是代码
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
public class DownLoadingListview extends ListView implements OnScrollListener {
View view;
Context context;
int totalItemCount=0;
int lastitem=0;
boolean isLoading=false;
public DownLoadingListview(Context context) {
super(context);
initView( context);
}
public DownLoadingListview(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public DownLoadingListview(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
//初始化Listview
private void initView(Context context){
this.context=context;
//加载底部正在加载视图
view= LayoutInflater.from(context).inflate(R.layout.downloading_item,null);
//进入设置隐藏
view.findViewById(R.id.footer).setVisibility(View.GONE);
//添加到listview里面
this.addFooterView(view);
//设置滚动监听
this.setOnScrollListener(this);
}
//实现滚动监听事件,来判断是否达到listview数据的最后一项
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//如果当前的item数量等于总item数量,并且滚动的状态已经停止了,我们就显示底部正在加载的布局
if (totalItemCount==lastitem&&scrollState==SCROLL_STATE_IDLE){
//如果是正在加载,就显示,否则不显示
if (!isLoading) {
isLoading=true;
view.findViewById(R.id.footer).setVisibility(View.VISIBLE);
}
//加载更多数据
loadinglistner.onLoad();
}
}
//对应三个int的参数的依次意义:item第一个位置,可见item数量,item总的数量
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//得到总共可见的item,如果等于总的item数量,也就是totalitemcount的时候,就是最后的一个item
this.lastitem=firstVisibleItem+visibleItemCount;
this.totalItemCount=totalItemCount;
}
//定义接口回调
//加载更多数据
//更新界面显示
public interface LoadingListener{
public void onLoad();
}
LoadingListener loadinglistner;
//获取接口
public void setInterFace(LoadingListener loadinglistner){
this.loadinglistner=loadinglistner;
}
}
我们在自定义的listview中定义了回调接口并且初始化,所以要在mainactivity中进行回调的具体操作
import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Adapter; import android.widget.ArrayAdapter; import android.widget.SimpleAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import static down_loading_listview.testforlistviewloading.R.id.listview; public class MainActivity extends AppCompatActivity implements DownLoadingListview.LoadingListener { DownLoadingListview loadingListview; List<String> list; MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadingListview= (DownLoadingListview) findViewById(listview); list=new ArrayList<>();//设置监听接口(回调) loadingListview.setInterFace(this); for (int i = 0; i < 4; i++) { list.add("qwe"); list.add("fsdaf"); list.add("q234234we"); list.add("q3242342311we"); } myAdapter=new MyAdapter(this,list); loadingListview.setAdapter(myAdapter); } //接口回调 @Override public void onLoad() { //获取更多数据,通知listview更新界面 Handler handler=new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { for (int i = 0; i < 4; i++) { list.add("1111"); list.add("23232323"); list.add("111223"); list.add("343434343"); }//此方法是在madapter进行notifydatasetChanged操作 myAdapter.update(); } },4000); } }