`

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

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

相关推荐

    通讯录的简易实现

    在Android中,这通常通过布局文件(如XML)完成,可以使用ListView或RecyclerView控件来显示联系人列表。每个列表项应包含联系人的姓名和电话号码,可以通过自定义Adapter绑定数据。例如,你可以创建一个`Contact`类...

    delphi 开发经验技巧宝典源码

    0206 如何在DBGrid中实现复制、粘贴功能 137 0207 在DBGrid中将选中的多行删除 137 0208 在DataGrid中如何使标题文字居中 138 0209 如何把ListBox中的内容拖曳到另一个ListBox中 139 0210 把DBGrid中的数据...

    delphi 开发经验技巧宝典源码06

    0206 如何在DBGrid中实现复制、粘贴功能 137 0207 在DBGrid中将选中的多行删除 137 0208 在DataGrid中如何使标题文字居中 138 0209 如何把ListBox中的内容拖曳到另一个ListBox中 139 0210 把DBGrid中的数据...

    vc++ 应用源码包_1

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_2

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_6

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_5

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_3

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 开发实例源码包

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

Global site tag (gtag.js) - Google Analytics