編輯:關於Android編程
在我們的實際項目中,數據應該說是很多的,我們的ListView不可能一下子把數據全部加載進來,我們可以當滾動條滾動到ListView的底部的時候,給一個更多的提示,當我們點擊它即加載下一頁的數據,相當與我們的分頁效果,參考網上的東西,寫了一個小小的demo,並總結了一些知識點,功能圖如下:
源代碼下載地址:http://download.csdn.net/detail/harderxin/7762625
掌握知識點:
1)自定義Adapter,將數據和ListView綁定起來<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+MqOpwO294kxheW91dEluZmxhdGVytq/MrLzT1Nh4bWyyvL7WtcTTw7eoPC9wPgo8cD4zo6lIYW5kbGVyu/rWxiAgNKOpTGlzdFZpZXe59ravysK8/jwvcD4KPHA+z+rPuLXEtPrC67TzvNK/ydLU1NrO0rXE18rUtNbQvfjQ0M/C1NijrM/Cw+a4+LTzvNLLtdK7z8K6y9DEtPrC67XEyrXP1qO6PC9wPgo8cD4xoaLO0sPHtqjS5bXEQWN0aXZpdHm8zLPQ19RMaXN0QWN0aXZpdHmjrM7Sw8fSsr/J0tTU2nhtbNbQtqjS5Uxpc3RWaWV3o6zIu7rzzai5/WZpbmRWaWV3QnlJZLvxyKGjrLP1yry7r6O6PC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;"> public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler=new Handler();
//繼承ListActivity,所以可以用這個方法取得
listView=getListView();
initData();
//添加底部按鈕
View bottomView=getLayoutInflater().inflate(R.layout.bottom, null);
loadMore=(Button)bottomView.findViewById(R.id.load);
loadMore.setOnClickListener(new ButtonClickListener());
listView.addFooterView(bottomView);
//setListAdapter(adapter);
listView.setAdapter(adapter);
//給listView設置事件
listView.setOnItemClickListener(new OnItemListener());
listView.setOnScrollListener(new OnScrollListener());
}
我們的底部按鈕可以通過listView.addFooterView(View view);加載進來,定義我們的按鈕布局文件:
然後我們可以通過View bottomView=getLayoutInflater().inflate(R.layout.bottom, null);獲得View對象,然後通過View對象的findViewById獲得我們的按鈕:loadMore=(Button)bottomView.findViewById(R.id.load);
2)初始化數據,在裡面我們初始化數據為10條,並實例化我們自定義的適配器MyAdapter
public void initData(){ Listdatas=new ArrayList (); for(int i=0;i<10;i++){ datas.add(i+1); } adapter=new MyAdapter(datas, this); }
package com.xin.activity; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends BaseAdapter{ private ListListView中每一行的xml布局:通過convertView=flater.inflate(R.layout.list, null);得到View,然後得到裡面相應的組件一條一條的添加到ListView中,datas; private LayoutInflater flater; //構造函數 public MyAdapter(List datas,Context context){ this.datas=datas; flater=LayoutInflater.from(context); } //得到數據總數 @Override public int getCount() { System.out.println("aaa"); return datas.size(); } //得到每一條數據 @Override public Object getItem(int position) { return datas.get(position); } //得到項目的位置 @Override public long getItemId(int position) { return position; } /** * ListView中所顯示的item都是通過調用Adapter對象的getView方法來得到一個View對象 * 然後把這個View對象放在這個item中,這樣的一個過程,這就是ListView和Adapter之間的關系 */ @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView==null){ //生成一個LayoutInflater對象 //inflater=LayoutInflater.from(context); //調用LayoutInflater對象的inflate方法生成一個view對象 //LayoutInflater 填充器,通過一個xml對象來填充ListView //inflate作用:填充一個新的視圖層次結構從指定的XML資源文件中 //參數:View的layout的ID、生成的層次結構的根視圖 //return 填充的層次結構的根視圖。如果參數root提供了,那麼root就是根視圖;否則填充的XML文件的根就是根視圖。 convertView=flater.inflate(R.layout.list, null); //生成ViewHolder對象 viewHolder=new ViewHolder(); //將convertView中的相關組件賦給ViewHolder中的成員變量 viewHolder.img=(ImageView)convertView.findViewById(R.id.img); viewHolder.info=(TextView)convertView.findViewById(R.id.info); //設置tag convertView.setTag(viewHolder); }else{ //從convertView中得到我們的viewHolder viewHolder=(ViewHolder)convertView.getTag(); } //給viewHolder中的組件添加相應的屬性 viewHolder.img.setBackgroundResource(R.drawable.ic_launcher); viewHolder.info.setText("選項"+datas.get(position)); return convertView; } //ViewHolder類,保存我們的組件信息,其中的變量值為我們在xml中定義的組件信息, //當我們的View通過convertView=flater.inflate(R.layout.list, null);生成出來後 //我們就可以在convertView取得ViewHolder組件中的相關信息,而不需要重新inflate一遍,減少內存的使用 class ViewHolder{ private ImageView img; private TextView info; } //添加數據 public void addItem(Integer i){ datas.add(i); } }
使用Handler中postDelayed方法,延遲2000毫秒執行裡面的代碼,雖然用到了Runnable類,但是它也是運行在主線程中的,並沒有另外開啟一個線程;
class ButtonClickListener implements OnClickListener{ @Override public void onClick(View v) { loadMore.setText("數據加載中"); handler.postDelayed(new Runnable() { @Override public void run() { System.out.println("hello"); loadData(); adapter.notifyDataSetChanged(); //listView.setSelection(5); loadMore.setText("加載更多"); } }, 2000); } } //加載數據 public void loadData(){ int count=adapter.getCount()+1; for(int i=count;i
5)ListView中的事件:單擊一行事件:
/** * 單擊ListView中某一項觸發的事件 * @author dell * */ class OnItemListener implements OnItemClickListener{ @Override public void onItemClick(AdapterView> arg0, View arg1, int position, long id) { System.out.println("123"); } }滾動加載事件://是否到達ListView底部 boolean isLastRow=false; /** * 滾動時產生的事件 * @author dell * */ class OnScrollListener implements android.widget.AbsListView.OnScrollListener{ //滾動的時候一直回調,直到停止滾動時才停止回調,單擊時回調一次 //firstVisibleItem:當前嫩看見的第一個列表項ID(從0開始,小半個也算) //visibleItemCount:當前能看見的列表項個數(小半個也算) //totalItemCount:列表項總共數 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { System.out.println("firstVisibleItem="+firstVisibleItem); System.out.println("visibleItemCount="+visibleItemCount); //判斷是否滾動到最後一行 if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){ System.out.println("已經到最後一行了"); isLastRow=true; } } //正在滾動時回調,回調2-3次,手指沒拋則回調2次,scrollState=2的這次不回調 //回調順序如下: //第一次:scrollState=SCROLL_STATE_TOUCH_SCROLL(1)正在滾動 //第二次:scrollState = SCROLL_STATE_FLING(2)手指做了拋的動作(手指離開屏幕前,用力滑了一下) //第三次:scrollState = SCROLL_STATE_IDLE(0) 停止滾動 //當屏幕停止滾動時為0;當屏幕滾動且用戶使用的觸碰或手指還在屏幕上時為1; //由於用戶的操作,屏幕產生慣性滑動時為2 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { System.out.println("789"); //當滾動到最後一行並且停止滾動時,執行加載 if(isLastRow&&scrollState==OnScrollListener.SCROLL_STATE_IDLE){ //執行加載代碼 isLastRow=false; } } }
拓展知識點LayoutInflater:我們在onCreate方法中總會有:setContentView(R.layout.main);出現,其實也可以使用LayoutInflater來加載:
setContentView(R.layout.main); show=(Button)findViewById(R.id.btn); //下面的方式和上面的方式是等同的 //LayoutInflater layoutInflater=LayoutInflater.from(this); //View vv=layoutInflater.inflate(R.layout.main, null); //setContentView(vv); //show=(Button)vv.findViewById(R.id.btn);區別是:setContentView()一旦調用, layout就會立刻顯示UI;而inflate只會把Layout形成一個以view類實現成的對象,有需要時再用setContentView(view)顯示出來。
一般在activity中通過setContentView()將界面顯示出來, 但是如果在非activity中如何對控件布局設置操作了,這就需要LayoutInflater動態加載。
LayoutInflater筆記:
/**
* 使用LayoutInflater來動態載入AlertDialog頁面顯示的內容,AlertDialog使用的布局方式在layout目錄下定義的custom_dialog.xml
*
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。
不同點是LayoutInflater是用來找res/layout/下的xml布局文件,並且實例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
什麼是已經被載入的layout,什麼是還沒有載入的.我們啟動一個應用,與入口Activity相關的layout{常見的是main.xml}就是被載入的,即在Oncreate()中的.
而其他的layout是沒有被載入的.就要動態載入了或通過另一個activity.
LayoutInflater作用是將layout的xml布局文件實例化為View類對象。
獲取LayoutInflater的方法有如下三種:
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.main, null);
LayoutInflater inflater = LayoutInflater.from(context); (該方法實質就是第一種方法,可參考源代碼)
View layout = inflater.inflate(R.layout.main, null);
LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,實際上是View子類下window的一個函數)
View layout = inflater.inflate(R.layout.main, null);
注意:
·inflate方法與 findViewById 方法不同;
·inflater 是用來找 res/layout下的 xml 布局文件,並且實例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。
* @author dell
*
*/
前言在日常開發APP 的過程中,隨著業務的擴展,規模的變化。我們的代碼規模也會逐漸變得龐大,每一個類裡的代碼也會逐漸增多。尤其是Activity和Fragment ,由於
Canvascanvas是一種抽象概念,是2D圖形系統中的重要部分,canvas一系列函數最終都是android 2D圖形庫Skia的一些列封裝,對應在SKCanvas.
在前面一篇文章淺談Service Manager成為Android進程間通信(IPC
JNI靜態(static)加載OpenCV本文地址: http://blog.csdn.net/caroline_wendy步驟:1. 准備OpenCV-Android庫