編輯:關於Android編程
本文的代碼接著上一篇獲取聯系人信息寫的。在獲取聯系人信息的時候,我發現遍歷Cursor來獲取所有聯系人的信息比較慢,比如我手機上有大約不到四百人的聯系方式,全部遍歷一次大約需要十多秒的時間。之前查了一下,暫時沒有找到太好的優化的辦法。我就想要不在遍歷聯系人信息的時候,在界面上顯示一個進度條,這樣用戶可以看到程序在一直運行,而不是誤認為程序死掉了。
在本篇的代碼中,主要是在獲取聯系人信息代碼的基礎上加上了一個ProgressDialog。代碼比較簡單,就不仔細說明了,下面看代碼:
package com.example.contactlist; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.ContactsContract; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class Loading extends ListActivity { Context myContext = null; MyListAdapter myListAdapter = null; ViewHolder viewHolder = null; private ProgressDialog progressDialog = null; // 用於存儲聯系人名稱 ListmyContactName = new ArrayList (); // 用於存儲聯系人電話 List myContactNumber = new ArrayList (); // 用於存儲聯系人總數 int myContactAmount = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getContactList(); } /** * 用Handler來更新UI */ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 通過arg1來判斷是繼續更新進度,還是顯示聯系人列表 switch (msg.arg1) { case 1: progressDialog.setProgress(msg.arg2); break; case 2: myListAdapter = new MyListAdapter(Loading.this); setListAdapter(myListAdapter); break; } } }; /** * 點擊按鈕事件listener */ private void getContactList() { // 顯示ProgressDialog progressDialog = new ProgressDialog(Loading.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setTitle("正在獲取聯系人信息,請稍等:"); progressDialog.setIndeterminate(false); progressDialog.show(); final Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); // 獲取聯系人總數 int myContactAmount = cursor.getCount(); progressDialog.setMax(myContactAmount); // 新建線程 new Thread() { public void run() { int i = 0; while (cursor.moveToNext()) { i++; // 聯系人的ID String id = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); // 聯系人的名稱 String name = cursor .getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 聯系人的電話 String number = ""; // 聯系人是否有電話號碼 int isHas = Integer .parseInt(cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); // 如果聯系人有電話,則遍歷他的所有電話號碼 if (isHas > 0) { Cursor c = getContentResolver() .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null); while (c.moveToNext()) { number += c .getString(c .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) + " "; } c.close(); } myContactName.add(name); myContactNumber.add(number); Message msg = new Message(); msg.arg1 = 1; msg.arg2 = i; handler.sendMessage(msg); } // 遍歷結束後,關閉進度條 progressDialog.dismiss(); cursor.close(); Message msg = new Message(); msg.arg1 = 2; handler.sendMessage(msg); } }.start(); } class MyListAdapter extends BaseAdapter { public MyListAdapter(Context context) { myContext = context; } public int getCount() { // TODO Auto-generated method stub return myContactName.size(); } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(myContext).inflate( R.layout.list, null); viewHolder.name = (TextView) convertView .findViewById(R.id.name); viewHolder.number = (TextView) convertView .findViewById(R.id.number); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.name.setText(myContactName.get(position)); viewHolder.number.setText(myContactNumber.get(position)); return convertView; } } private static class ViewHolder { TextView name; TextView number; } }
布局文件:
list.xml
程序運行結果如下:
1 創建Android工程 首先建立一個名為AndroidJniTest的Android工程,包名默認為com.example.androidjnitest,src目錄
一、示意圖:1)開始畫面:2)游戲中畫面:3)結束畫面:二、分析:1、游戲中的每個元素都可封裝成對象,1)開始按鈕與結束按鈕可封裝成GameButton對象:屬性有:有坐
1、list(列表) 列表是常用的UI控件,mui封裝的列表組件比較簡單,只需要在ul節點上添加.mui-table-view類、在li節點上添加.mui-table-
仿微信通訊錄右側快速定位字母表控件先看效果圖: 界面比較單調,湊合看,主要看功能。這種控件在很多應用的通訊錄的界面,MIUI裡面的通訊錄都有這個功能,其實這是一