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使用分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.