ListView分頁展示資料功能一(按鈕方式)
阿新 • • 發佈:2019-01-04
package com.demo.listviewpageadddatas1; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity implements OnScrollListener { public static final String TAG = "MainActivity"; List<String> items = new ArrayList<String>(); private ListView listView; private int visibleLastIndex = 0; // 最後的可視項索引 private int visibleItemCount; // 當前視窗可見項總數 private ListViewAdapter adapter; private View loadMoreView; private Button loadMoreButton; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 動態載入包含有‘載入更多’按鈕的佈局 */ loadMoreView = getLayoutInflater().inflate(R.layout.load_data, null); /** * 從loadMoreView佈局中取出按鈕控制元件 */ loadMoreButton = (Button) loadMoreView .findViewById(R.id.loadMoreButton); /** * 繫結loadMoreButton按鈕點選事件 */ loadMoreButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /** * 給loadMoreButton按鈕設定文字文字 */ loadMoreButton.setText("正在載入..."); // 設定按鈕文字loading /** * handler.postDelayed(runnable, 1000); * 是一個定時器,後面的1000指的是每隔一秒執行一次runnable中的方法 ; * 如果想要關閉此定時器,可以這樣操作handler.removeCallbacks(runnable); */ handler.postDelayed(new Runnable() { @Override public void run() { Log.d(TAG, "---進入handler.postDelayed()方法"); loadData(); adapter.notifyDataSetChanged(); // 資料集變化後,通知adapter listView.setSelection(visibleLastIndex - visibleItemCount + 1); // 設定選中項 loadMoreButton.setText("載入更多"); // 恢復按鈕文字 Log.d(TAG, "---離開handler.postDelayed()方法"); } }, 1000); } }); /** * 獲得ListView控制元件物件 */ listView = (ListView) this.findViewById(R.id.listView1); /** * 給ListView的最後一個View追加一個View:loadMoreView */ listView.addFooterView(loadMoreView); // 設定列表底部檢視 // listView.addHeaderView(v) //設定列表頂部檢視 initAdapter(); listView.setAdapter(adapter); // 自動為id是list的ListView設定介面卡 listView.setOnScrollListener(this); // 新增滑動監聽 /** * 給ListView的子項繫結點選事件 */ listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), items.get(position), Toast.LENGTH_SHORT).show(); } }); } /** * 初始化介面卡 */ private void initAdapter() { for (int i = 0; i < 10; i++) { items.add("資料_"+(i + 1)); } adapter = new ListViewAdapter(items, this); } /** * 正在滾動時回撥,回撥2-3次,手指做了拋的動作(手指離開螢幕前,用力滑了一下),回撥三次,否則回撥兩次 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 回撥順序如下 // 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滾動 // 第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了拋的動作(手指離開螢幕前,用力滑了一下) // 第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滾動 // 當螢幕停止滾動時為0;當螢幕滾動且使用者使用的觸碰或手指還在螢幕上時為1; // 由於使用者的操作,螢幕產生慣性滑動時為2 Log.d(TAG, "-----進入onScrollStateChanged()方法,scrollState=" + scrollState); int itemsLastIndex = adapter.getCount() - 1; // 資料集最後一項的索引 int lastIndex = itemsLastIndex + 1; // 加上底部的loadMoreView項 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) { // 如果是自動載入,可以在這裡放置非同步載入資料的程式碼 Log.i("LOADMORE", "loading..."); Log.d(TAG, "-----如果是自動載入,可以在這裡放置非同步載入資料的程式碼"); } Log.d(TAG, "-----離開onScrollStateChanged()方法"); } /** * 滾動時一直回撥,直到停止滾動時才停止回撥。單擊時回撥一次。 1.firstVisibleItem:當前能看見的第一個列表項ID(從0開始); * 2.visibleItemCount:當前能看見的列表項個數(小半個也算) ; 3.totalItemCount:列表項共數 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.d(TAG, "----進入onScroll()方法"); Log.d(TAG, "----item總數totalItemCount:" + totalItemCount); Log.d(TAG, "----visibleItemCount:" + visibleItemCount); Log.d(TAG, "----firstVisibleItem:" + firstVisibleItem); this.visibleItemCount = visibleItemCount; visibleLastIndex = firstVisibleItem + visibleItemCount - 1; Log.d(TAG, "----離開onScroll()方法"); } /** * 模擬載入資料 */ private void loadData() { int count = adapter.getCount(); for (int i = count; i < count + 10; i++) { adapter.addItem("載入新資料_"+(i + 1)); } } }
ListViewAdapter.java中程式碼
package com.demo.listviewpageadddatas1; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ListViewAdapter extends BaseAdapter { private static Map<Integer, View> m = new HashMap<Integer, View>(); private List<String> items; private LayoutInflater inflater; public ListViewAdapter(List<String> items, Context context) { super(); this.items = items; this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return items.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return items.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View contentView, ViewGroup parent) { // TODO Auto-generated method stub contentView = m.get(position); if (contentView == null) { contentView = inflater.inflate(R.layout.listview_item, null); TextView text = (TextView) contentView .findViewById(R.id.list_item_text); text.setText(items.get(position)); } m.put(position, contentView); return contentView; } public void addItem(String item) { items.add(item); } }