使用复选框过滤联系人并获取电话号码

我正在开发一款类似于所有Android手机上的默认短信应用的应用。 我的问题是选择多个用户发送短信。 到目前为止我所做的事情是将我的联系人存储为带有复选框的listview项目。 现在我只需要从所选联系人那里获取电话号码。

所以我在做的事情上遇到了麻烦。 1)从我的列表视图中显示的联系人中提取电话号码2)在新活动的文本视图中显示该号码

对不起,如果我的代码难以理解,请询问您是否需要进行操作。

这是显示listview的XML,名为contact_manager.xml:

   

这是我的活动,它将所有东西放在一起。

 public final class ContactManager extends Activity { public static final String TAG = "ContactManager"; private ListView mContactList; private boolean mShowInvisible; private Button mShowInvisibleControl; /** * Called when the activity is first created. Responsible for initializing * the UI. */ @Override public void onCreate(Bundle savedInstanceState) { Log.v(TAG, "Activity State: onCreate()"); super.onCreate(savedInstanceState); setContentView(R.layout.contact_manager); // Obtain handles to UI objects mContactList = (ListView) findViewById(R.id.contactList); mShowInvisibleControl = (Button) findViewById(R.id.showInvisible); // Initialize class properties mShowInvisible = false; // mShowInvisibleControl.setChecked(mShowInvisible); mShowInvisibleControl.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { } }); populateContactList(); } /** * Populate the contact list based on account currently selected in the * account spinner. */ private void populateContactList() { // Build adapter with contact entries Cursor cursor = getContacts(); String[] fields = new String[] { ContactsContract.Data.DISPLAY_NAME }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, fields, new int[] { R.id.contactEntryText }); mContactList.setAdapter(adapter); } /** * Obtains the contact list for the currently selected account. * * @return A cursor for for accessing the contact list. */ private Cursor getContacts() { // Run query Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible ? "0" : "1") + "'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return managedQuery(uri, projection, selection, selectionArgs, sortOrder); } 

contact_entry.xml

        

这是我的invite_text.xml这实际上是我想输入数字的文本视图,所以我可以发送大量的短信。

      

如果您需要我发布更多信息,请询问。

我没有查看你的代码,但这里有适合我的机制:

1.setOnCheckedChangeListener放入复选框。

2.如果CheckboxChecked则将该联系人添加到arraylist

3.如果unchecked CheckBox ,则从arraylist删除该联系人。

4.使用startActivityForResult()启动联系人列表活动并覆盖onActivityResult()

5.leaving contact activity之前, leaving contact activity selected contacts in intent设置selected contacts in intent

6.接收活动中的选定联系人。

7.现在您已选择可在TextView显示的联系人。

注意:您需要使用自定义列表适配器:

定制列表适配器:

 public class YourAdapterName extends BaseAdapter{ private Context mContext; private ArrayList mValuestoShow; /** * Constructor to be called to initialize adapter with values. * @param context * @param vector */ public YourAdapterName(Context context, ArrayList contacts){ mContext = context; mValuestoShow = contacts; } public int getCount() { if(null != mValuestoShow){ return mValuestoShow.size(); } return 0; } public Object getItem(int position) { if(position < mValuestoShow.size()) return mValuestoShow.get(position); else return null; } public long getItemId(int position) { return 0; } /** * This method can be override to enable/disable particular list row. */ @Override public boolean isEnabled(int position) { //Write your code here...... return super.isEnabled(position); } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { LayoutInflater li =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = li.inflate(R.layout.contact_list_layout, null); holder = new ViewHolder(); holder.name = (TextView)convertView.findViewById(R.id.name); holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText(text goes here ....); holder.checkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if ( isChecked ) //Add contact... else //Remove contact. } }); return convertView; } class ViewHolder { TextView name; CheckBox checkbox; } } 

your_layout.xml

      

请按照以下步骤使其正常工作:

– >有一个布尔数组,大小等于游标。 该数组将表示已检查的联系状态。 – >在xml make复选框中不可点击且不可聚焦。 – > ListVIew上的setOnItemClickListener和onItemClick方法切换位置上的布尔数组值,选择项目。 – >在Button上设置OnClickListener,并通过以下方式从侦听器的onClick方法获取数字:

 ArrayList numbers=new ArrayList(); cursor.moveToFirst(); for(int i=0;i 

//使用ArrayList数字发送联系人,似乎你可以在同一个消息中附加多个数字,在这种情况下通过循环向数字发送消息,请参阅以下主题: 在android amd 中向 多人 发送短信无法使用发送短信Android中的SMSManager

你的问题没有问题。 您必须编写自己的适配器并支持多选。 我已经回答了类似的问题(如果这有帮助,请告诉我,我可以详细解释):

Android列表视图切换按钮

android:ListView中的复选框(所选元素的奇怪行为)

我只想发布战略答案。 对列表适配器使用hashmap。 使用未显示的密钥存储要拨打的电话号码。 允许在列表视图中进行多项选择。 使用所选条目中存储的电话号码。

我建议你看看我上个月在这个链接上编写的教程,以管理列表中复选框的选择(它可以帮助你保持状态并按ID检索项目)。

我认为如果您按ID管理列表但向用户显示联系人姓名会更好。 在那之后你可以传递你的id并用jeet告诉你的机制发送它们。

我认为下面的代码会给出你所期望的结果……你的主要课程会像下面的那样…

 import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; public class GetSelectedContacts extends Activity{ int CONTACTS_REQUEST_CODE =1; Activity thisActivity; ArrayList selectedConatcts; LinearLayout contactdisp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); thisActivity = this; Button btn = (Button)findViewById(R.id.btn_selectContact); contactdisp = (LinearLayout)findViewById(R.id.lnr_contactshow); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(thisActivity,ListActivitySampleActivity.class); startActivityForResult(intent, CONTACTS_REQUEST_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null){ Bundle bundle = data.getExtras(); if(requestCode ==1){ selectedConatcts = bundle.getStringArrayList("sel_contacts"); Log.v("", "Selected contacts-->"+selectedConatcts); if(selectedConatcts.size()<0){ }else{ for(int i =0;i 

联系人选择类就像

 import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.util.Log; import android.util.SparseBooleanArray; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class ListActivitySampleActivity extends Activity { static ContentResolver cr; String[] phone_nos; ArrayList selectedContacts = new ArrayList(); Activity thisActivity; Button btn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); thisActivity = this; final ListView lst = (ListView)findViewById(R.id.listView1); populateContact(); ArrayAdapter adapter = new ArrayAdapter(thisActivity, android.R.layout.simple_list_item_multiple_choice, phone_nos); lst.setAdapter(adapter); lst.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); lst.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) { } }); final int len = lst.getCount(); final SparseBooleanArray checked = lst.getCheckedItemPositions(); btn = (Button)findViewById(R.id.btn_send); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for (int i = 0; i < len; i++) if (checked.get(i)) { selectedContacts.add(phone_nos[i]); //you can you this array list to next activity /* do whatever you want with the checked item */ } Bundle bundle = new Bundle(); bundle.putStringArrayList("sel_contacts", selectedContacts); Intent contactIntent = new Intent(); contactIntent.putExtras(bundle); setResult(1, contactIntent); thisActivity.finish(); // Log.v("", "selected-->"+selectedContacts); } }); } private void populateContact(){ Uri myContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI ; Cursor mqCur = managedQuery(myContacts, null, null, null, null); phone_nos = new String[mqCur.getCount()]; int i =0; if(mqCur.moveToFirst()) { do { String phone_no = mqCur.getString(mqCur .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); phone_nos[i] = phone_no; i++; } while(mqCur.moveToNext()); } } }