ListView下拉加载更多练习
来源:互联网 发布:java redis缓存数据库 编辑:程序博客网 时间:2024/05/18 01:31
1:自定义尾部
新建一个尾部布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:id="@+id/load_layout"
android:gravity="center"
android:layout_height="wrap_content">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Base.Widget.AppCompat.ProgressBar"
/>
<TextView
android:layout_width="wrap_content"
android:textSize="15sp"
android:layout_height="wrap_content"
android:text="正在加载..."/>
</LinearLayout>
</LinearLayout>
自定义一个LoadlistView继承Listview
实体bean自己完成
public class Loadlistview extends ListView implements AbsListView.OnScrollListener {
View foote;//底部
int totalItemCount;//总数量
int lastItem;//最后的数量
boolean isLoading;//如果在加载
LoadListtener loadListtener;
public Loadlistview(Context context) {
super(context);
initView(context);
}
public Loadlistview(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public Loadlistview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
//添加底部加载提示布局
private void initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
foote = inflater.inflate(R.layout.loadfooter_layout, null);
foote.findViewById(R.id.load_layout).setVisibility(View.GONE);//设置初始为隐藏
this.addFooterView(foote);
this.setOnScrollListener(this);
}
//监听下拉操作,
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (totalItemCount == lastItem && scrollState == SCROLL_STATE_IDLE) {
if(!isLoading){
isLoading=true;
foote.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);//设置初始为隐藏
loadListtener.onLoad();//滑动到最底层的时候调用此方法
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//四个参数为:第一个可见item,第二个可见item,可见item数量,总数量。
this.lastItem = firstVisibleItem + visibleItemCount; //最后一个item等于第一个item+可见item
this.totalItemCount = totalItemCount;
}
//通过这个方法把接口设置进加载数据中
public void setInterface(LoadListtener loadListtener){
this.loadListtener=loadListtener;
}
//加载更多数据的回调接口
public interface LoadListtener{
public void onLoad();
}
//加载完毕后关闭加载底部
public void loadComplte(){
isLoading=false;
foote.findViewById(R.id.load_layout).setVisibility(View.GONE);
}
}
在主方法中使用自定义的Loadlistview
public class HotelOrderActivity extends Activity implements Loadlistview.LoadListtener {
private Loadlistview mListView;
private LinearLayout back;
private HotelAdpter mAdapter;
private List<HotelOrderBean> mlist = new ArrayList<HotelOrderBean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hotelorder_activity);
back = (LinearLayout) findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
getData();
showListView(mlist);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(HotelOrderActivity.this, HotelDetalisActivity.class);
startActivity(intent);
}
});
}
private void showListView(List<HotelOrderBean> mlist) {
//适配器是空就set数据,如果不是空,调用适配器中加载更多的方法
if (mAdapter == null) {
mListView = (Loadlistview) findViewById(R.id.hotel_listview);
mListView.setInterface(this);
mAdapter = new HotelAdpter(this, mlist);
mListView.setAdapter(mAdapter);
} else {
mAdapter.onDataChange(mlist);
}
}
private void getData() {
for (int i = 0; i < 10; i++) {
HotelOrderBean ho = new HotelOrderBean();
ho.name = "皇家假日酒店" + i;
mlist.add(ho);
}
}
private void LoadData() {
for (int i = 0; i < 4; i++) {
HotelOrderBean ho = new HotelOrderBean();
ho.name = "更多假日酒店" + i;
mlist.add(ho);
}
}
//实现接口重写onLoad接口,获取更多数据,通知ListView更新数据
@Override
public void onLoad() {
//加载太快
Handler handler =new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
LoadData();
showListView(mlist);
mListView.loadComplte();//调用如果滑动到最底部的方法,说明加载完毕
}
}, 1800);
}
自定义适配器:
private class HotelAdpter extends BaseAdapter {
private List<HotelOrderBean> mlist;
private LayoutInflater mInflater;
//数据变化时调用,刷新界面
public void onDataChange(List<HotelOrderBean> mlist) {
this.mlist = mlist;
this.notifyDataSetChanged();
}
public HotelAdpter(Context context, List<HotelOrderBean> list) {
mlist = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mlist.size();
}
@Override
public Object getItem(int position) {
return mlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.hotelorder_listview_item, null);
}
TextView tx = (TextView) convertView.findViewById(R.id.hotelname);
HotelOrderBean ho = mlist.get(position);
tx.setText(ho.name);
return convertView;
}
}
}
总结:首先给Listview 添加尾部,设置滑动监听事件,滑动到尾部的时候,尾部布局才出现( this.lastItem =
firstVisibleItem + visibleItemCount; //最后一个item等于第一个item+可见item
实现回调接口中的onLoad()方法 ,在onLoad中实现加载更多数据方法。
总结:首先给Listview 添加尾部,设置滑动监听事件,滑动到尾部的时候,尾部布局才出现( this.lastItem =
firstVisibleItem + visibleItemCount; //最后一个item等于第一个item+可见item
this.totalItemCount = totalItemCount;
)。实现回调接口中的onLoad()方法 ,在onLoad中实现加载更多数据方法。
0 0
- ListView下拉加载更多练习
- listView下拉加载更多
- ListView 下拉刷新 加载更多
- ListView的下拉加载更多
- Listview 下拉刷新,上拉加载更多
- Android ListView 下拉刷新 点击加载更多
- ListView的下拉刷新,点击加载更多
- android listview 下拉刷新以及加载更多
- android listview 下拉加载更多demo
- Listview下拉刷新上拉加载更多
- 下拉刷新,上拉加载更多ListView
- ListView下拉刷新,上拉加载更多
- Android ListView实现下拉刷新、加载更多
- 简单搞定listview下拉加载更多
- ListView下拉刷新上拉加载更多
- 自定义ListView控件实现下拉加载更多
- android ListView下拉刷新上拉加载更多
- Android下拉刷新上拉加载更多ListView控件
- Leetcode # 75 Sort Colors
- 调用MYSQL存储过程实例
- 从头开始写项目Makefile(六):参数传递、条件判断、include .
- Java ConcurrentModificationException 异常分析与解决方案
- 黑马程序员--反射
- ListView下拉加载更多练习
- oracle多表查询(7)
- Mysql配置
- Spark源码阅读笔记之DiskStore
- 关于ubuntu下git ssh key重设的一些东东
- SVM 的推导、特点、优缺点、多分类问题及应用
- 如何在QML中使用camera API来拍照
- 多表查询2(8)
- 使用VS2012创建ActiveX控件