android 使用CursorLoader讀取手機通訊錄

使用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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章