ListView結合PullToRefreshScrollView 下拉重新整理
阿新 • • 發佈:2019-01-22
public class MainActivity extends Activity implements OnPullEventListener,
OnRefreshListener {
// 測試的ListView
private ListView mListView;
// ListView的headerView
private View mListHeaderView;
// 下拉重新整理控制元件
private PullToRefreshScrollView mPullRefreshScrollView;
// ListView的測試資料
private ArrayList<String> mData;
// 獲取資料的重新整理任務
private LoadDataTask mLoadDataTask;
private View mTopItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initViews();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mData);
mListView.setAdapter(adapter);
initEvents();
}
private void initEvents() {
// ListView 的滑動事件
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// Log.i("TAG", "headerView.getTop :" + mListHeaderView.getTop());
//測試看看mListHeaderView 算不算第一個列表項
//測試下來, mListHeaderView 就是第0個元素, 第一個列表項,
//ListHeaderView 主要是為了新增一個和列表項區別很大的列表元素, 但還是列表項的首項
if(mTopItem != null) {
String info = (mTopItem == mListHeaderView) ? "mListHeaderView is first item." : "mListHeaderView is not first item.";
// Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT).show();
}
if (firstVisibleItem == 0) {
mPullRefreshScrollView.setMode(Mode.PULL_FROM_START);// 如果是listview的首項則下拉重新整理
if(mTopItem == null) {
mTopItem = view.getChildAt(0);
}
} else {
// 這裡如果簡單把RefreshScrollView設定為disabled的話,
// 在一些時候比如下拉然後突然向上,此時scrollview會卡住不上不下
if (mPullRefreshScrollView.getState() == State.RESET) {
mPullRefreshScrollView.setMode(Mode.DISABLED);
}else if(firstVisibleItem > 3 || 0 - mListHeaderView.getTop() > 100){
//重新整理過程中判斷上滑超過3個時還沒有重新整理完畢,則取消重新整理, 同時取消非同步任務,
//但是如果列表項每一個都很高的話, 比如新增一個ListHeaderView可能高度比較高用上滑動項個數判斷就不合理了,
//那應該判斷上滑距離, 觀察getTop 上滑是負數, 比如上滑超過100畫素,則取消
mPullRefreshScrollView.onRefreshComplete();
if(mLoadDataTask != null) {
mLoadDataTask.cancel(true);
}
Toast.makeText(getApplicationContext(), "重新整理取消", Toast.LENGTH_SHORT).show();
}
}
}
});
//不要忘記繫結下拉重新整理控制元件的兩個事件監聽器
//下拉時候的顯示setOnPullEventListener
mPullRefreshScrollView.setOnPullEventListener(this);
//重新整理時具體需要完成的任務
mPullRefreshScrollView.setOnRefreshListener(this);
}
private void initData() {
mData = new ArrayList<String>();
for (int i = 'a'; i < 'z'; i++) {
mData.add((char) i + "-- 測試Item");
}
}
private void initViews() {
mListView = (ListView) findViewById(R.id.drag_list);
mListHeaderView = LayoutInflater.from(this).inflate(R.layout.header_listview, null);
mListView.addHeaderView(mListHeaderView, null, true);
mPullRefreshScrollView = (PullToRefreshScrollView) findViewById(R.id.pull_refresh_scrollview);
mListView.setSelection(0);
}
// OnPullEventListener 下拉事件需要複寫的方法, 下拉時顯示上次重新整理時間
@Override
public void onPullEvent(PullToRefreshBase refreshView, State state,
Mode direction) {
//下拉的時候需要顯示上次重新整理的時間的話需要在資料庫中記錄上次重新整理時間, 這裡是測試生成的時間
long time = 30 * 1000L;
String label = String.format("上次重新整理:%s", "從未");
if (time > 0)
label = String.format("上次重新整理:%s",
TimeUtils.getListTime(this.getResources(), System.currentTimeMillis() - time));
mPullRefreshScrollView.getLoadingLayoutProxy().setLastUpdatedLabel(
label);
}
/**
* 重新整理事件 , 執行任務, 已經在跑則返回
*/
@Override
public void onRefresh(PullToRefreshBase refreshView) {
if (mLoadDataTask != null && mLoadDataTask.getStatus() == Status.RUNNING) {
return;
}
mLoadDataTask = new LoadDataTask();
mLoadDataTask.execute();
}
private class LoadDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Call setRefreshing when the list begin to refresh.
mPullRefreshScrollView.setRefreshing(true);
}
@Override
protected Void doInBackground(Void... params) {
// 一些耗時的資料操作, 這裡測試休眠2秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Call onRefreshComplete when the list has been .
mPullRefreshScrollView.onRefreshComplete();
// 重新整理任務非同步完成後, 判斷重新整理是否成功 ,分別給予提示
if (!mData.isEmpty()) {
Toast.makeText(getApplicationContext(), "重新整理成功", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(getApplicationContext(), "重新整理失敗", Toast.LENGTH_SHORT)
.show();
}
}
}
}