使用CursorLoader讀取手機通訊錄
今天get到一個新技能,使用CursorLoader異步加載數據通訊錄數據。
實現功能:通過讀取手機通訊錄所有聯繫人的名字及聯繫號碼,將數據通過CursorLoader異步加載到ListView上。
這是效果圖。因爲模擬器上我只存了一個聯繫人,使用效果不明顯,我將apk下載到手機上安裝讀取聯繫人完全沒有問題,因爲聯繫人關係到一些不可描述的小祕密,就不截圖出來了。
工程目錄結構圖:
非常簡單有木有,只有一個類和兩個佈局文件,一個是activity的佈局文件,一個是自定義適配器的佈局文件。好吧,又是自定義適配器。我的原則就是學習的時候多寫多練,所以我都是怎麼複雜怎麼來的。
上代碼———————————–
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
private ListView listView;
private LoaderManager loaderManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
loaderManager = getLoaderManager();
loaderManager.initLoader(1111, null, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
Uri uri = ContactsContract.Contacts.CONTENT_URI;
CursorLoader cursorLoader = new CursorLoader(this, uri, null, null,
null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Auto-generated method stub
List<List<String>> list = new ArrayList<List<String>>();
//list存儲整個聯繫人的數據
while (data.moveToNext()) {
String name = null;
List<String> list_data = new ArrayList<String>();
//list_data存儲單個聯繫人的數據,我只讀取了名字和電話號碼。
name = data.getString(data
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
int id = data.getInt(data
//android 內部通訊錄並不是將電話和聯繫人存儲在同一張表格中,而是通過一個ID將聯繫人和電話關聯
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor cursor = getContentResolver().query( //通過ID獲取對應的電話表格遊標
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
+ id, null, null);
while (cursor.moveToNext()) {//遍歷遊標獲取電話
list_data.add(name);
list_data.add(cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
//ContactsContract.CommonDataKinds下的常量可以去查找一下官方API太多了一兩句解釋不清,官網這一節有中文的的翻譯
}
list.add(list_data);
}
myAdapter adapter = new myAdapter(list);
listView.setAdapter(adapter);
}
//自定義適配器
class myAdapter extends BaseAdapter {
List<List<String>> list = new ArrayList<List<String>>();
public myAdapter(List<List<String>> list) {
// TODO Auto-generated constructor stub
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = null;
if (convertView == null) {
view = LayoutInflater.from(MainActivity.this).inflate(
R.layout.list, null);
} else {
view = convertView;
}
TextView textView2 = (TextView) view
.findViewById(R.id.list_textView2);
TextView textView3 = (TextView) view
.findViewById(R.id.list_textView3);
List<String> list1 = new ArrayList<String>();
list1 = list.get(position);
textView2.setText(list1.get(0));
textView3.setText(list1.get(1));
return view;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub
}
}
佈局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#cccccc"
android:paddingBottom="10sp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:paddingTop="10dp"
android:text="姓名"
android:textColor="#2828ff"
android:textSize="20sp" />
<TextView
android:id="@+id/textView3"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center_horizontal"
android:paddingTop="10dp"
android:text="電話"
android:textColor="#2828ff"
android:textSize="20sp" />
</LinearLayout>
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal" >
<TextView
android:id="@+id/list_textView2"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="TextView"
android:textSize="20sp" />
<TextView
android:id="@+id/list_textView3"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:text="TextView"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>