获得联系人显示于ListView中,并实现单击联系人拨号

来源:互联网 发布:python telnet expect 编辑:程序博客网 时间:2024/05/29 10:46
很多书上只讲到了从数据库中获得联系人,并显示在一个ListView中,却没有讲到单击联系人需要拨号,经过本人努力,实现了这个功能。
主要是需要知道并获得CursorWrapper 这个类,它是指针的封装类,可以用于获得当前指针指向的数据。代码公布如下:
import android.app.Activity;import android.app.PendingIntent;import android.content.ContentUris;import android.content.Intent;import android.database.Cursor;import android.database.CursorWrapper;import android.graphics.Color;import android.net.Uri;import android.os.Bundle;import android.provider.Contacts.People;import android.telephony.PhoneNumberUtils;import android.telephony.gsm.SmsManager;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.LinearLayout;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.Toast;public class App extends Activity {private static final String TAG="App";ListView listView;ListAdapter adapter;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);       // setContentView(R.layout.main);        LinearLayout linearLayout=new LinearLayout(this);        linearLayout.setOrientation(LinearLayout.VERTICAL);        linearLayout.setBackgroundColor(Color.BLACK);        LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);                listView=new ListView(this);        listView.setBackgroundColor(Color.BLACK);                linearLayout.addView(listView,param);                this.setContentView(linearLayout);                //从数据库获取联系人姓名和电话号码        Cursor cur=this.getContentResolver().query(People.CONTENT_URI,null, null,null,null);        adapter=new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2,cur,new String[]{People.NAME,People.NUMBER},new int[]{android.R.id.text1,android.R.id.text2});        this.startManagingCursor(cur);        listView.setAdapter(adapter);        //listView.setEmptyView(findViewById(R.id.empty));                listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {// TODO Auto-generated method stub//openToast("滚动到:"+arg0.getSelectedItemId());//短信发送//PendingIntent pi = PendingIntent.getActivity(App.this,0,new Intent(App.this,App.class),0);//SmsManager sms = SmsManager.getDefault();  //sms.sendTextMessage("5554", null, "message", pi, null); }public void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}                });        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {// TODO Auto-generated method stub//String[] names=((CursorWrapper)listView.getItemAtPosition(position)).getColumnNames();//从指针的封装类中获得选中项的电话号码并拨号CursorWrapper wrapper=(CursorWrapper)listView.getItemAtPosition(position);int columnIndex=wrapper.getColumnIndex(People.NUMBER);if(!wrapper.isNull(columnIndex)){String number=wrapper.getString(columnIndex);Log.d(TAG,"number="+number);////判断电话号码的有效性if(PhoneNumberUtils.isGlobalPhoneNumber(number)){Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel://"+ number));startActivity(intent);}}}        });    }    private void openToast(String str){    Toast.makeText(this,str,Toast.LENGTH_SHORT).show();    }}

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.wt.app"      android:versionCode="1"      android:versionName="1.0">    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".App"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <!-- 点击拨号时,询问调用默认的程序还是调用本程序拨号 -->   <intent-filter>    <action android:name="android.Intent.Action.CALL_BUTTON" />   <category android:name="android.Intent.Category.DEFAULT" />    </intent-filter>         </activity>    </application>    <uses-permission android:name="android.permission.READ_CONTACTS" />    <uses-sdk android:minSdkVersion="3" /></manifest> 



ANDROID初级历险之spinner篇
listview和spinner都算是adapter容器,在显示时都需要一个adapter去装载需要显示的数据。上一篇已经介绍了怎样用adapter去做数据绑定,这节我们去看看下试图部分的模板。
回忆下,在listview中的ArrayAdapter部分,我们用过simple_list_item_1做视图模板。这个视图模板实际上就是一个textview组件而已。你到对应sdk的layout目录下可以找到答案。同时你也可以发现还有很多可用的模板:simple_list_item_2,simple_list_item_checked,simple_list_item_multiple_choice,simple_list_item_single_choice…这些模板理论上都可以替换原来的simple_list_item_1。具体看进去:simple_list_item_2就是2个textview构成的。simple_list_item_multiple_choice和simple_list_item_single_choice实际上就是个CheckedTextView,checkMark属性是个reference类型,引用单选或多选按钮图片就成了上面2个视图的区别。
同理,spinner也有2种模板。simple_spinner_item,这个是textview的。simple_spinner_dropdown_item,这个是带单选按钮的。
所以熟悉了系统自带的默认模板,有时候我们会发现大部分情况下,我们并不需要自定义视图模板了…
稍微仔细观察下listview和spinner的不同,你会发现listview是全屏的,而spinner的是模态的圆角非全屏的。显然spinner的表现要好得多,那它和listview有什么不同呢?
spinner有一个属性android:prompt,提示这样描述的,The prompt to display when the spinner’s dialog is shown。哦,原来弹出的是个dialog。那弹出的dialog中这么显示列表呢?源代码进去找,发现个AlertDialog有setItems方法或者setAdapter方法,可以让我们轻松的显示一个集合列表。在仔细看进去,你还会发现几个类似的方法:setMultiChoiceItems,setSingleChoiceItems …
基本上到这里,常用的listview和spinner之间的区别就这些了。
0 0