Выбор списка Android ListView - PullRequest
       3

Выбор списка Android ListView

3 голосов
/ 10 ноября 2010

У меня вроде есть вопрос из двух частей.

1) Как я могу заполнить свой ListView так, чтобы строки отображали то, что отображается, но когда элементы выбраны, невидимое значение идентификатора (идентификатор контакта из телефонных контактов) является значением, которое фактически используется?

2) У меня есть ListView, который использует режим множественного выбора для выбора элементов. Он заполнен именами из моего списка контактов. Когда я выбираю элемент в ListView, я хочу, чтобы этот выбранный элемент вызывал вызов моей подпрограммы SqLite для сохранения значения в записи базы данных. Как сделать так, чтобы это событие сработало, когда элемент проверен в списке?

Это мой макет XML;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

<ListView
    android:id="@+id/lvContacts"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:choiceMode="multipleChoice"
/>

</LinearLayout>

А вот код, который я использую для заполнения моего ListView;

    private void fillData() {
    final ArrayList<String> contacts = new ArrayList<String>();

    // Let's set our local variable to a reference to our listview control
    // in the view.
    lvContacts = (ListView) findViewById(R.id.lvContacts);

    String[] proj_2 = new String[] {Data._ID, Phone.DISPLAY_NAME, CommonDataKinds.Phone.TYPE};
    cursor = managedQuery(Phone.CONTENT_URI, proj_2, null, null, null);
    while(cursor.moveToNext()) {
        // Only add contacts that have mobile number entries
        if ( cursor.getInt(2) == Phone.TYPE_MOBILE ) {
            String name = cursor.getString(1);
            contacts.add(name);
        }
    }

    // Make the array adapter for the listview.
    final ArrayAdapter<String> aa;
    aa = new ArrayAdapter<String>(this,
                                  android.R.layout.simple_list_item_multiple_choice,
                                  contacts);

    // Let's sort our resulting data alphabetically.
    aa.sort(new Comparator<String>() {
        public int compare(String object1, String object2) {
            return object1.compareTo(object2);
        };
    });

    // Give the list of contacts over to the list view now.
    lvContacts.setAdapter(aa);
}

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

Любая помощь будет очень признательна. Спасибо.

1 Ответ

2 голосов
/ 10 ноября 2010

Я думаю, что решение вашей проблемы заключается в использовании настраиваемого адаптера списка, в котором каждый элемент содержит имя и идентификатор контакта, вот подробности:

1) Попробуйте создать пользовательский элемент контакта, включающий 2 свойства: contactID, contactName

public class contactItem{
    private long contactID;
    private String contactName;

    //...
}

Создать CustomContactAdapter:

public class CustomContactAdapter extends ArrayAdapter<contactItem>{

    ArrayList<contactItem> itemList = null;

    //Constructor
    public CustomContactAdapter (Context context, int MessagewResourceId,
            ArrayList<contactItem> objects, Handler handler) {
        //Save objects and get LayoutInflater
        itemList = objects;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ReceiveMailStruct contact= items.get(position);

        if (contact!= null) {
            view = inflater.inflate(R.layout.layout_display_contact_item, null);
                        //Set view for contact here
         }
    }

}

Поиск пользовательского адаптера для получения дополнительной информации

2) Чтобы обработать событие щелчка в ListView, вы должны зарегистрировать обработчик для listitem: Шаг 1: Зарегистрируйте обработчик для элемента списка:

lvContacts.setOnItemClickListener(new HandlerListClickEvent());

Шаг 2: Реализация процесса при нажатии элемента (отметьте / снимите флажок)

class HandlerListClickEvent implements OnItemClickListener {
    public void onItemClick( AdapterView<?> adapter, View view, int position, long id ) {
    //Get contact ID here base on item position
}

Надеюсь, это поможет, С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...