標籤:pre not 清單項目 注意 amp listview list instance pac
1:先定義一個listview控制項。
2:定義模板視圖:
3:定義底部view的視圖:
4:編寫原始碼,實現下拉重新整理的效果:
package com.huanglinbin.finsh;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.Button;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.SimpleAdapter;import android.widget.Toast;public class MainActivity extends Activity implements OnScrollListener {//私人化屬性。private SimpleAdapter sa;private ListView lv;//listviewprivate Button but;//按鈕private ProgressBar pb;//載入條private List<Map<String,Object>> list;//集合//listview的底部view的視圖。private View moreView;//非同步載入器。private Handler handler;//設定最大的載入數,超過時就不再載入。private int maxNum;//最後可見條目索引。private int lastVisibleIndex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //設定最大的資料數(相當於資料庫中所有的資料) maxNum = 50; //首先要先找到listview的控制項。 lv = (ListView) findViewById(R.id.listView1); //先執行個體化底部view的視圖。 moreView = getLayoutInflater().inflate(R.layout.but,null); //初始化資料。 list = new ArrayList<Map<String,Object>>(); //類比資料庫。 for(int i=0;i<20;i++){ Map<String,Object> map = new HashMap<String, Object>(); map.put("tv1","第"+i+"標題"); map.put("tv2","第"+i+"內容"); list.add(map); } //執行個體化模擬器。 sa = new SimpleAdapter(MainActivity.this, list, R.layout.item, new String[]{"tv1","tv2"}, new int[]{R.id.tv1,R.id.tv2} ); //載入底部的view的視圖。注意一定要在setAdapter載入模擬器之前。 lv.addFooterView(moreView); lv.setAdapter(sa); //給listview綁定滾動的監聽事件。 lv.setOnScrollListener(MainActivity.this); //擷取到按鈕。 //but = (Button) findViewById(R.id.but); pb = (ProgressBar) findViewById(R.id.pb); //非同步載入器。 handler = new Handler(); //給按鈕綁定點擊的監聽事件。 /* but.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//將進度條顯示出來。pb.setVisibility(View.VISIBLE);//將按鈕顯示為不可見。but.setVisibility(View.GONE);//在這裡進行非同步資料的載入。(參數1:new 運行控制項,參數2:非同步載入的時間)handler.postDelayed(new Runnable() {@Overridepublic void run() {//載入更多的資料。lostmove();//將進度條顯示出來。pb.setVisibility(View.VISIBLE);//將按鈕顯示為不可見。but.setVisibility(View.GONE);//通知listview重新整理資料。sa.notifyDataSetChanged();}},2000);}});*/ } //定義每次載入資料的方法。 private void lostmove(){ //擷取到適配器中的資料。 int count = sa.getCount(); //進行判斷資料不足載入資料時的判斷。 if(count+5<maxNum){ //每次載入資料5條。 for(int i=count;i<count+5;i++){ Map<String,Object> map1 = new HashMap<String, Object>(); map1.put("tv1","第"+i+"標題"); map1.put("tv2","第"+i+"內容"); list.add(map1); } }else{ //資料不足5條資料載入的時候的資料載入。 for(int j=count;j<maxNum;j++){ Map<String,Object> map1 = new HashMap<String, Object>(); map1.put("tv1","第"+j+"標題"); map1.put("tv2","第"+j+"內容"); list.add(map1); } } } public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {//滾動時一直回調,直到停止滾動時才停止回調。單擊時回調一次。//firstVisibleItem:當前能看見的第一個清單項目ID(從0開始)//visibleItemCount:當前能看見的清單項目個數(小半個也算)//totalItemCount:清單項目共數 // 計算最後可見條目的索引lastVisibleIndex = firstVisibleItem+visibleItemCount-1;//所有的清單項目已經和最大的資料數相等時,則移除底部的listview的視圖。if(totalItemCount == maxNum+1){//移除底部listview。lv.removeFooterView(moreView);Toast.makeText(MainActivity.this, "資料已經全部載入完畢!", Toast.LENGTH_SHORT).show();}}public void onScrollStateChanged(AbsListView view, int scrollState) {//滑到底部後載入,判斷listview已經停止滾動並且最後可視的條目等於adapter的條目if(scrollState==OnScrollListener.SCROLL_STATE_IDLE&&lastVisibleIndex==sa.getCount()){//將進度條顯示出來。pb.setVisibility(View.VISIBLE);handler.postDelayed(new Runnable() {@Overridepublic void run() {//載入更多的資料。lostmove();//將進度條顯示出來。pb.setVisibility(View.VISIBLE);//通知listview重新整理資料。sa.notifyDataSetChanged();}},2000);}} }
5::
Android-下拉重新整理