1 我不喜欢用implements 的方式来写代码
2 各种方式的区别总结
3 看LoadMoreListView源码
public class HomeSubjectListUI extends BaseFragmentActivity implements AdapterView.OnItemClickListener, NetRequestUtils.RequestListener, LoadMoreListView.RefreshListener, SwipeRefreshLayout.OnRefreshListener {
//加载更多数据lv
private LoadMoreListView praoseLv = null;
// 刷新控件
private SwipeRefreshLayout swipeLayout;
//是否正在加载数据标记,正在加载就是true,反之false,如果正在加载就不再调用接口
//1 初始值false; 2 开始加载数据前判断,false才调用,并改变其状态true;3 在数据回调中改为false
private boolean isLoadingData = false;
//adapter
private HomeSubjectListAdapter adapter;
//data
private List<SubjectVo> source;
//当前页,初始值1(根据后台接口会有不同),加载一页成功之后+1;
private int currentPage = 1;
//正在加载的页面,如果成功加载完毕,就将其赋值给crrentPage,加载失败就什么都不做,感觉有点多余
//其实就在成功回调中将currentPage++就可以了啊,刷新页面再将currentPage==1;
private int oldPage = 1;
//没有数据的提示
private TextView empty_view;
@Override
protected void setContentView() {
setContentView(R.layout.praise_list_layout);
}
@Override
protected void findViewById() {
praoseLv = (LoadMoreListView) findViewById(R.id.refreshListView);
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
empty_view = (TextView) findViewById(R.id.empty_view);
}
@Override
protected void setListener() {
//?
praoseLv.setOnScrollListener(new PauseOnScrollListener(NextApplication.mImageLoader, true, true));
//加载更多的监听
praoseLv.setOnRefreshListener(this);
//下拉刷新
swipeLayout.setOnRefreshListener(this);
}
@Override
protected void initData() {
swipeLayout.setColorSchemeResources(R.color.app_title_bg);
empty_view.setVisibility(View.GONE);
//提前new ArrayaList
source = new ArrayList<SubjectVo>();
//提前new Adapter
adapter = new HomeSubjectListAdapter(this, source);
//提前setAdapter,这三步有时候我是在加载完数据之后做的
praoseLv.setAdapter(adapter);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(true);
loadData(1);
}
}, 500);
mRequestUtils = NetRequestUtils.getInstance();
}
private void loadData(int page) {
if (isLoadingData) {
return;
}
isLoadingData = true;
oldPage = page;
Map<String, String> params = new HashMap<String, String>();
params.put("page", page + "");
params.put("type", type + "");
params.put("classid","0");
JSONObject jsonRequest = mRequestUtils.getJsonRequest("home", "class_get_video", params);
mRequestUtils.requestJsonObject(jsonRequest, this);
}
@Override
public void onRefresh() {
loadData(1);
}
@Override
public void loadMore() {
loadData(currentPage + 1);
}
@Override
public void start() {
}
@Override
public void success(JSONObject response) {
currentPage = oldPage;
if (currentPage == 1) {
source.clear();
}
//这里用的是原生的解析方式
JSONArray jsonArray = response.optJSONArray("data");
parseJson(jsonArray);
adapter.resetSource(source);
isLoadingData = false;
swipeLayout.setRefreshing(false);
//判断请求回来数据的个数,后台定义一页有10条数据,如果小于10条,说明数据加载完毕,不用再去调加载更多的接口,反之就去加载
if (jsonArray != null && jsonArray.length() >= 10) {
praoseLv.resetFooterState(true);
} else {
praoseLv.resetFooterState(false);
}
}
@Override
public void error(VolleyError error, int errorCode, String errorMsg) {
isLoadingData = false;
swipeLayout.setRefreshing(false);
if (error != null) {
error.printStackTrace();
} else {
MyToast.showToast(this, errorMsg);
}
}
/*
解析json
将arr中的obj循环遍历拿出来,解析为我们要的对象,在一个个add到source中
比较麻烦,用gson可以直接解析为我们要的List,然后addAll,如果是下拉刷新,或者加载第一页
这里的方式是进行判断,如果currentPage是1,那么将source清空,否则就add
*/
private void parseJson(JSONArray jsonArray) {
if (jsonArray != null) {
if (jsonArray.length() > 0) {
int count = jsonArray.length();
for (int i = 0; i < count; i++) {
SubjectVo uInfo = new SubjectVo().parse(jsonArray.optJSONObject(i));
source.add(uInfo);
}
}
}
}
}
项目中ListView使用分析
最新推荐文章于 2022-03-01 23:23:08 发布