Список выбора нескольких контактов [getCheckedItemPositions ()] - PullRequest
4 голосов
/ 12 февраля 2011

Ниже приведен мой класс Contact_Picker.Я собираюсь использовать этот класс для создания списка контактов с флажками, давая пользователю возможность выбрать несколько контактов из своей телефонной книги.У меня есть макет XML, который я использую, у которого есть 2 кнопки внизу: Очистить все и Готово.

Когда нажата кнопка «Готово», мне нужно получить все проверенные имена и сохранить их в файле списка / настроек.Прямо сейчас я могу найти, какие ПОЗИЦИИ проверяются, но я не знаю, как получить соответствующую информацию, связанную с ними (имя / номер телефона выбранного контакта).Я искал несколько дней метод, который будет работать, и ничего не придумал.Любой код / ​​псевдокод / ​​идеи приветствуются.

Класс Contact_Picker:

public class Contact_Picker extends ListActivity {

    protected static final String TAG = null;
    public String[] Contacts = {};
    public int[] to = {};
    public ListView myListView;




    /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.contacts_list);

            final Button done_Button = (Button) findViewById(R.id.done_Button);
            final Button clear_Button =(Button) findViewById(R.id.clear_Button);

            Cursor mCursor = getContacts();
            startManagingCursor(mCursor);

            ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, mCursor,
                    Contacts = new String[] {ContactsContract.Contacts.DISPLAY_NAME },
                    to = new int[] { android.R.id.text1 });
            setListAdapter(adapter);
            myListView = getListView();
            myListView.setItemsCanFocus(false);
            myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);



            clear_Button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(getApplicationContext(),"Selections Cleared", Toast.LENGTH_SHORT).show();
                    ClearSelections();
                }
            });

            /** When 'Done' Button Pushed: **/
            done_Button.setOnClickListener(new View.OnClickListener() {
                public void onClick (View v){


                    Log.i(TAG,":Done Button Selected:");
                    SparseBooleanArray checkedPositions = myListView.getCheckedItemPositions();
                    Log.i(TAG,"Number of Checked Positions: " + checkedPositions.size());
                    if (checkedPositions != null)
                    {
                        int count = myListView.getCount();
                        for ( int i=0;i<count;i++)
                        {
                            Log.i(TAG,"Selected items: " + checkedPositions.get(i));
                        }
                    }

                }
            }); //<-- End of Done_Button

        } //<-- end of onCreate();


        private void ClearSelections() {            

            int count = this.myListView.getAdapter().getCount();

            for (int i = 0; i < count; i++) {
                this.myListView.setItemChecked(i, false);
            }

        }

        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 + " = '"
                    + ("1") + "'";
            String[] selectionArgs = null;
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                    + " COLLATE LOCALIZED ASC";

            return managedQuery(uri, projection, selection, selectionArgs,
                    sortOrder);
        } //<-- end of getContacts();

}

Создает вывод, такой как:

Sele02-12 01:25:09.733: INFO/(219): :Done Button Selected:
02-12 01:25:09.743: INFO/(219): Number of Checked Positions: 2
02-12 01:25:09.743: INFO/(219): Selected items: true
02-12 01:25:09.743: INFO/(219): Selected items: false
02-12 01:25:09.743: INFO/(219): Selected items: true
02-12 01:25:09.752: INFO/(219): Selected items: false

Ответы [ 4 ]

1 голос
/ 09 апреля 2012

см.

  public String[] getlistcontacts() {
    // TODO Auto-generated method stub

    int i=0;
    ContentResolver cr = getContentResolver();
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null, null, null);
     Cursor pCur = cr.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  null, null , null);
        int a= cur.getCount();
    String[] cttlist=new String[a+1];

    cur.moveToFirst();
    pCur.moveToFirst();
    for (int j=0; j<a;j++){
        int nm=cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        //int nb=pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        String name=cur.getString(nm);
        int nb=pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

        String number=pCur.getString(nb);
        cttlist[i]=name.concat("<;>").concat(number);

        //Toast.makeText(PizzastimeActivity.this, "alkamkljziha"+name+":"+number, Toast.LENGTH_LONG).show();
        i++;
        cur.moveToNext();
        pCur.moveToNext();
    }

    return cttlist;
}

в этом коде я попытался получить список контактов в таблице строк, тогда вы можете легко использовать его

0 голосов
/ 12 июля 2012

Вот правильный подход:

SparseBooleanArray selectedPositions = listView.getCheckedItemPositions();

for (int i=0; i<selectedPositions.size(); i++) {
    if (selectedPositions.get(selectedPositions.keyAt(i)) == true) {
        //do stuff
    }
}
0 голосов
/ 13 мая 2011

Я забыл об этом посте, пока команда Pannous не оставила ответ. Я уверен, что их метод будет работать, но в итоге я использовал это вместо:

            SparseBooleanArray checked = myListView.getCheckedItemPositions();
            for (int i = 0; i < ContactsList.length; i++) {
                Log.v(TAG, ContactsList[i] + ": " + checked.get(i));  //<-- Will print every contact with 'true'
                if (checked.get(i) == true) {
                    Object o = getListAdapter().getItem(i);
                    String name = o.toString();
                    WriteSettings(self, name);
                }
            }

На всякий случай, если у кого-то еще возникнут проблемы с просмотром списка с множественным выбором.

0 голосов
/ 12 мая 2011

возможно, вы можете вручную отслеживать ваши контакты:

        Vector<String> names=new Vector<String>();
        private Cursor getContacts() {...
            Cursor cur =  managedQuery(uri, projection, selection, selectionArgs,
                    sortOrder);
            int col = cur.getColumnIndex("display_name");
            while(cur.moveToNext())
                    names.add(cur.getString(col));
                cur.moveToFirst();
            return cur; 
        }

и затем выводить их синхронно:

for ( int i=0;i<count;i++)
{
  Log.i(TAG,"Selected items: " + checkedPositions.get(i));
  Log.i(TAG,"Selected name: " + names.get(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...