編輯:關於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(){
List datas=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 List 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);
}
}
ListView中每一行的xml布局:通過convertView=flater.inflate(R.layout.list, null);得到View,然後得到裡面相應的組件一條一條的添加到ListView中,
使用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
*
*/
Android MVP 十分鐘入門!
前言在日常開發APP 的過程中,隨著業務的擴展,規模的變化。我們的代碼規模也會逐漸變得龐大,每一個類裡的代碼也會逐漸增多。尤其是Activity和Fragment ,由於
canvas的常見用法
Canvascanvas是一種抽象概念,是2D圖形系統中的重要部分,canvas一系列函數最終都是android 2D圖形庫Skia的一些列封裝,對應在SKCanvas.
Android系統進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路
在前面一篇文章淺談Service Manager成為Android進程間通信(IPC
Android - JNI靜態(static)加載OpenCV
JNI靜態(static)加載OpenCV本文地址: http://blog.csdn.net/caroline_wendy步驟:1. 准備OpenCV-Android庫