很多书上只讲到了从数据库中获得联系人,并显示在一个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之间的区别就这些了。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐