import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.List;
/**
* Created by Administrator on 2016/2/26 0026.
*/
public abstract class BaseListViewAdapter<T> extends BaseAdapter {
private List<T> list;
protected Context context;
private LoadMoreListener loadMoreListener;//加载更多接口
public boolean isLoading = false;//是否正在加载
private int currentPage = 0;//当前页
private boolean isFirstLoad = true;//是否第一次调用网络数据
public void setRefreshAndLoadMoreListener(ListView listView, LoadMoreListener listener) {
this.loadMoreListener = listener;
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//正在加载数据时禁止再次加载
if (isLoading) {
return;
}
//当本地数据和网络数据一致时不再加载
if (!isFirstLoad&&getCount() >= loadMoreListener.getAllQueryItemCount()) {
return;
}
if (firstVisibleItem + visibleItemCount + loadMoreListener.getReverseItemIndexLoadMore() > totalItemCount + 1) {
isLoading = true;
loadMoreListener.loadMore(currentPage + 1);
}
}
});
}
/**
* 第一次加载或者刷新时需要调用
*/
public void startRefresh() {
isLoading = true;
}
/**
* 第一次加载或者刷新后需要调用
* @param success
*/
public void refreshResult(boolean success) {
if (success) {
currentPage = 0;
isFirstLoad = false;
}
isLoading = false;
notifyDataSetChanged();
}
/**
* 加载更多后需要调用
* @param success
*/
public void loadMoreResult(boolean success) {
if (success) {
currentPage++;
isFirstLoad = false;
}
isLoading = false;
notifyDataSetChanged();
}
public BaseListViewAdapter(List<T> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = getItemViewResource();
recordAllWidget(holder.sparseArray, convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
bindItemData(holder.sparseArray, list.get(position), position);
return convertView;
}
//重新此方法返回root view
public abstract View getItemViewResource();
//在这个方法中进行view和数据的绑定
public abstract void bindItemData(SparseArray<View> sparseArray, T t, int position);
//sparseArray中需要根据id记录下所有需要用到的子view
public abstract void recordAllWidget(SparseArray<View> sparseArray, View main);
class ViewHolder {
public SparseArray<View> sparseArray = new SparseArray();
}
interface LoadMoreListener {
/**
* 返回网络上查询的所有记录数
*
* @return
*/
int getAllQueryItemCount();
/**
* 距离剩下几个item开始自动加载更多
*
* @return
*/
int getReverseItemIndexLoadMore();
/**
* 加载下一页
*
* @param currentPage
*/
void loadMore(int currentPage);
}
}
编写一个带有加载更多的通用的listview adapter
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 作者: 夏至 欢迎转载,也请保留这段申明http://blog.csdn.net/u011418943/artic...
- 我们都知道,在安卓中使用ListView显示多条数据的时候,必须要用一个适配器作为Data和View的桥梁,这种设...
- flutter当中提供了无限加载的组件,再此基础上又做了一层封装。这个可复用的无限加载列表包括以下特点: 上滑加载...
- 1.概述 上一期我们已经写了一篇 打造炫酷通用的ViewPager指示器 - 玩转字体变色 可是这种效果虽然绚烂可...