Multithumb found errors on this page:

There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/adapter10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/adapter10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listview_contextual10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listview_contextual10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/undobutton02.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/undobutton02.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/undobutton10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/undobutton10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listactivity10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listactivity10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listlayout10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listlayout10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listlayoutIndividual10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/listlayoutIndividual10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/interactive10.png
There was a problem loading image http://www.vogella.com/articles/AndroidListView/images/interactive10.png

Android ListView и перечень работ

Описывает, как использовать этот учебник ListViews и деятельности в Список Android. В учебном пособии на основе Eclipse, 4.2, Java 1.6 и Android 4.2.


Оглавление

Первый Android и каналы
1.1. ListView
1.2. Адаптеры
1.3. Адаптер реализации
1.4. Например ListView
1.5. Вход для массива адаптер
1.6. Добавление и удаление данных в адаптер
1.7. Слушатель
1.8. Фильтрация и сортировка
Второй Адаптер реализации
2.1. Разработка пользовательских адаптеров
2.2. Пример адаптер
2.3. Возможный вклад в адаптер и взаимодействия
2.4. Данные обновления к адаптеру
Треть Список активность
3.1. Обзор
3.2. Перечень видов деятельности и макет
Четвёртое Список фрагментов
Пятый ListViews и производительность
5.1. Трудоемкие операции
5.2. ConvertView
5.3. Организатор Pattern
5.4. Пример
Шестой Контекстная режима действия для представлений списка
Седьмой Реализация состояний для отмены действия
Восьмой Руководство: Создать список активность
Девятый Учебник: Список активность с собственными макета
Десятый Учебник: Реализация собственного адаптера
10.1. Определение простой адаптер
10.2. Оптимизация производительности
11 Учебник: Как отображать два элемента в ListView
12 Выбор нескольких элементов в ListView
12.1. Взаимодействие между моделью и ListView
12.2. Учебник: модель предметной области и строк взаимодействия
13 Учебник: Разное
13.1. Добавление долго ClickListener к ListItems
13.2. Против нескольких Одноместный выбора
13.3. Расширяемая ListView
13,4. Колонтитулы
Четырнадцатое Простой CursorAdapter
Пятнадцатой Дополнительные открытые библиотеки
Шестнадцатого Спасибо
Семнадцатый Вопросы и обсуждение
Восемнадцатая Ссылки и литература
18.1. Исходный код
18.2. ListView ресурсов
18.3. vogella ресурсов

Первый Android и каналы

1.1. ListView

На дисплее элементов в списках является очень распространенной картины в мобильных приложениях. Пользователь видит список элементов, и можно прокручивать их. Если он выбирает один из элементов списка, это может обновить ActionBar или триггеры подробную экран для выбора.

Android предоставляет ListView класса, который способен отображать прокручивать список элементов. Эти элементы могут быть любого типа.

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

  <? Xml версия = "1.0" кодировка = "UTF-8">
 <LinearLayout XMLNS: андроид = "http://schemas.android.com/apk/res/android"
     Android: layout_width = "match_parent"
     Android: layout_height = "match_parent"
     Android: ориентация = "вертикальной">

     <ListView
         Android: ID = "@ + ID мой_список /"
         Android: layout_width = "match_parent"
         Android: layout_height = "wrap_content">
     </ ListView>

 </ LinearLayout> 

1.2. Адаптеры

Адаптеры используются для предоставления всех данных на ListView объекта. Адаптер таким образом, определяет, как каждая строка ListView отображается.

Адаптер назначен на ListView через setAdapter метод ListView объекта.

1.3. Адаптер реализации

Адаптер расширить BaseAdapter класса. Android предоставляет некоторые стандартные адаптеры, наиболее важными являются ArrayAdapter и CursorAdapter .

ArrayAdapter может работать с данными, основанными на Arrays или java.util.List .

SimpleCursorAdapter может обрабатывать базы данных, связанных с. Это описание Ориентирован на случай, не база данных.

1.4. Например ListView

Следующий пример кода из шоу на использование ArrayAdapter класса и предопределенный макет системы Android, которая предполагает примере макета Activity содержит ListView с mylist ID. Этот пример использует предопределенный макет ( android.R.layout.simple_list_item1 ) с платформой Android.

  ListView ListView = (ListView) findViewById (R.id.mylist);
 String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
   "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
   "Linux", "OS / 2"};

 / / Определить новый адаптер
 / / Первый параметр - контекст
 / / Второй параметр - макет для строк
 / / Третий параметр - идентификатор TextView, к которым данные записываются
 / / Forth - массив данных

 <String> Массива адаптер переходник = новый <String> адаптер Array (это,
   android.R.layout.simple_list_item_ 1, android.R.id.text1, ценности);


 / / Присвоить адаптер для ListView
 listView.setAdapter (адаптер); 

1.5. Вход для массива адаптер

ArrayAdapter класса может справиться с любой объект Java в качестве входных данных. Он отображает данные этого вклада в TextView в макете. Вы можете определить один в конструкторе, в противном случае android.R.id.text1 ID будет использоваться.

ArrayAdapter использует toString() метод объекта входных данных для сдерживания моя строка, которая должна отображаться.

1.6. Добавление и удаление данных в адаптер

ArrayAdapter класса позволяет удалить все элементы в своей структуре данных с clear() вызова метода. Вы можете добавить новые элементы с помощью add() метод или коллекции через addAll() метод.

1.7. Слушатель

Чтобы реагировать на выборы в списке набор для OnItemClickListener на ваш ListView .

  listView.setOnItemClickListener (Новый OnItemClickListener () {
   @ Override
   общественного недействительными onItemClick (адаптер View <> родителей, вид В,
     Int позицию, долгое ID) {
     Toast.makeText (getApplicationContext ()
       "Нажмите ListItem номер" + позиция, Toast.LENGTH_LONG)
       . Show ();
   }
 }); 

1.8. Фильтрация и сортировка

Фильтрация и сортировка выполняется с помощью адаптера. Вам нужно реализовать логику в пользовательской реализации адаптера.

Второй Адаптер реализации

2.1. Разработка пользовательских адаптеров

Для контроля данных, подтверждающих это назначение и назначение нескольких Views , вы создаете свой ​​собственный Adapter реализации. Для этого нужно расширить существующие реализации адаптера или суб-причислять BaseAdapter класса напрямую.

ListView вызывает getView() метод на адаптер для каждого элемента данных. В этом методе адаптер определяется мины расположение строки и, как данные отображаются на Views в этом макете.

Этот корень компоновки, как правило, ViewGroup (менеджер компоновки) и содержит ряд других Views например, на ImageView и TextView .

Адаптер обеспечивает данные и определяет структуру каждой строки

В getView() метод вы бы раздуть в XML на основе макета, а затем установите значения отдельных Views в макете. Для раздувания в макете XML можно использовать системную службу LayoutInflator . Эта услуга может получить доступ через Activity либо через context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) вызова метода.

Отдельные элементы в макете могут быть найдены через findViewById() вызова метода.

2.2. Пример адаптер

Ниже показан на реализацию собственного адаптера. Этот адаптер Предполагается, что у вас есть два PNG файлов (no.png и yes.png) в одном из ваших res/drawable папки. Кодирование раскрытие в файл макета XML, находит соответствующие Views в макете и устанавливает их содержание на основе входных данных.

  de.vogella.android.listactivity пакет;

 Импорт android.content.Context;
 Импорт android.view.LayoutInflater;
 Импорт android.view.View;
 Импорт android.view.ViewGroup;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ImageView;
 Импорт android.widget.TextView;

 общественных MySimpleArrayAdapter класс расширяет <String> массива адаптер {
   Окончательный частный контекст контексте;
   частных окончательного String [] значения;

   общественных MySimpleArrayAdapter (Context контексте, String [] значения) {
     супер (контекст, R.layout.rowlayout, ценности);
     этом контексте = контекста.
     это значение = значение.
   }

   @ Override
   Посмотреть общественных GetView (INT положение, вид convertView, ViewGroup родителей) {
     LayoutInflater инфлятор = (LayoutInflater) контекст
         . GetSystemService (Context.LAYOUT_INFLATER_SERVICE);
     Посмотреть RowView = inflater.inflate (R.layout.rowlayout, родителей, ложные);
     TextView TextView = (TextView) rowView.findViewById (R.id.label);
     ImageView ImageView = (ImageView) rowView.findViewById (R.id.icon);
     textView.setText (значения [должность]);
     / / Изменить значок для ОС Windows и iPhone
     Струнный S = значение [должность];
     если (s.startsWith ("iPhone")) {
       imageView.setImageResource (R.drawable.no);
     Else {}
       imageView.setImageResource (R.drawable.ok);
     }

     RowView вернуться;
   }
 } 

2.3. Возможный вклад в адаптер и взаимодействия

Адаптер может получить любой объект Java в качестве входных данных. В свою getView() метод извлекает правильные данные из объекта данных и присваивает эти данные для просмотра в строку, которая представляет данные.

Строка может содержать Поэтому взгляды, которые взаимодействуют с базовой моделью данных через адаптеры. Например, вы можете иметь Checkbox в строке макета и, если Checkbox установлен, лежащих в основе изменения данных.

2.4. Данные обновления к адаптеру

notifyDataSetChanged() метод адаптера вызывается, если данные изменились или если новые данные.

notifyDataSetInvalidated() метод вызывается, если данные больше не доступны.

Треть Список активность

3.1. Обзор

ListActivity Какой класс расширяет Activity класса была разработана для упрощения обработки ListViews .

Это не назначить макет ListActivity в нем по умолчанию ListView и определяет onListItemClick() метод для обработки выбора элементов списка. Внутренняя ListActivity регистров OnItemClickListener на ListView .

ListActivity Позволяет установить адаптер для ListView через setListAdapter() метод.

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;
 Импорт android.widget.ArrayAdapter;

 Список общественных MyListActivity класс расширяет активность {
   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     <String> Массива адаптер переходник = новый <String> адаптер Array (это,
         android.R.layout.simple_list_item_ 1, ценности);
     setListAdapter (адаптер);
   }
 } 

3.2. Перечень видов деятельности и макет

ListActivity не требует, чтобы вы назначаете расположение к нему через setContentView() метод, если вы хотите, чтобы показать ListView ListActivity содержит по умолчанию ListView .

В случае, если Вам необходимо включить больше Views , чем ListView в ListActivity вы можете спокойно назначить макет вашей Activity . В этом случае макет должен содержать ListView с android:id атрибут установлен в @android:id/list .

  <ListView
   Android: ID = "@ андроид: идентификатор / список"
   Android: layout_width = "match_parent"
   Android: layout_height = "wrap_content">
 </ ListView> 

Если вы используете View с @android:id/empty ID в макете, ListActivity , будут автоматически отображаться эта View , если ListView пуст и спрятать его в противном случае. Например, вы могли показать здесь, в ErrorMessage.

Четвёртое Список фрагментов

ListView может быть использован для фрагмента.

Android предоставляет ListFragment Какой класс обеспечивает упрощение для списка обработки. Например, вы можете напрямую позвонить setListAdapter() , чтобы назначить адаптеру. Это похоже на использование ListActivity видов деятельности.

В следующем примере показан простой ListFragment реализации.

  de.vogella.android.fragments пакет;

 Импорт android.content.Intent;
 Импорт android.os.Bundle;
 Импорт android.view.View;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ListView;
 Импорт android.app.ListFragment;

 Список общественного класс расширяет MyListFragment фрагмента {

   @ Override
   общественного недействительными onActivityCreated (Bundle savedInstanceState) {
     Супер onActivityCreated (savedInstanceState).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     <String> Массива адаптер переходник = новый <String> адаптер Array (getActivity (),
         android.R.layout.simple_list_item_ 1, ценности);
     setListAdapter (адаптер);
   }

   @ Override
   общественного недействительными onListItemClick (ListView л, вид у, Int позицию, долгое ID) {
     / / Сделайте что-нибудь с данными

   }
 } 

Пятый ListViews и производительность

5.1. Трудоемкие операции

Каждый View , которые получают завышенные из XML-файл макета приведет к объекту Java. Создание Java-объектов является дорогим по отношению к времени и памяти.

Кроме того, использование findViewById() метод является относительно много времени, даже если это не так плохи, как XML раздувания.

Эта часть описывает, как уменьшить эти операции, чтобы сделать ваш ListView быстрее. По умолчанию Android адаптеров, как ArrayAdapter уже оптимизированы производительность.

5.2. ConvertView

ListView как правило, содержат больше данных, то количество отображаемых строк. Если пользователь прокручивает список, то строки и связанные с ними Views будет прокручиваться из видимой области. Java-объекты, которые представляют строки могут быть повторно использованы для новых видимых строк.

Если Android мины, которые детерминированный View , который представляет собой строку не видно больше Это позволяет getView() метод, чтобы использовать его через convertView параметров.

Оптимизированные адаптер назначает новые данные в convertView . Это позволяет избежать раздувания в файл XML и создания новых объектов Java.

В случае отсутствия View является доступным для повторного использования, Android будет проходить null до convertView параметров. Поэтому реализации адаптера нужно проверить это.

5.3. Организатор Pattern

Посмотреть картину держатель позволяет избежать findViewById() вызова метода для повторного convertView .

Просмотр Организатор класса статического внутреннего класса в вашем адаптере, который содержат ссылки на соответствующие Views в вашем макете. Эта ссылка присваивается View которые представляют собой строки макета, с помощью тега setTag() метод.

Если мы получим convertView объект, мы можем получить экземпляр ViewHolder через getTag() метод и назначить новые атрибуты Views через ViewHolder ссылка.

Хотя это кажется сложным, это ок. 15% быстрее, затем с помощью findViewById() метод.

5.4. Пример

Следующий код показывает, оптимизированные реализации адаптера Какие Повторное использование существующих взглядов и реализует владельца картины.

  de.vogella.android.listactivity пакет;

 Импорт android.app.Activity;
 Импорт android.view.LayoutInflater;
 Импорт android.view.View;
 Импорт android.view.ViewGroup;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ImageView;
 Импорт android.widget.TextView;

 общественных MyPerformanceArrayAdapter класс расширяет <String> массива адаптер {
   Окончательный частный контекст деятельности;
   частных окончательного String [] имена;

   Просмотр статических классов Гельдера {
     общественности текст TextView;
     ImageView имиджа;
   }

   общественных MyPerformanceArrayAdapter (Activity контексте, String [] имена) {
     супер (контекст, R.layout.rowlayout, имена);
     этом контексте = контекста.
     это имена = имена.
   }

   @ Override
   Посмотреть общественных GetView (INT положение, вид convertView, ViewGroup родителей) {
     Просмотр RowView = convertView;
     если (RowView == NULL) {
       LayoutInflater инфлятор = context.getLayoutInflater ();
       RowView = inflater.inflate (R.layout.rowlayout, NULL);
       Просмотр просмотра держатель держатель = новый вид держатель ();
       viewHolder.text = (TextView) rowView.findViewById (R.id.TextView01);
       viewHolder.image = (ImageView) RowView
           . FindViewById (R.id.ImageView01);
       rowView.setTag (вид держатель);
     }

     Просмотр держатель держатель = (Посмотреть Holder) rowView.getTag ();
     Струнный S = имена [должность];
     holder.text.setText (ы);
     если (s.startsWith ("Windows7") | | s.startsWith ("iPhone")
         | | S.startsWith ("Солярис")) {
       holder.image.setImageResource (R.drawable.no);
     Else {}
       holder.image.setImageResource (R.drawable.ok);
     }

     RowView вернуться;
   }
 } 

Шестой Контекстная режима действия для представлений списка

Для следующих предполагает, что вы уже знакомы с понятием ActionBar и контекстная действия режима в целом. В первой части будет рассказано, как использовать контекстную режима действия для ListView выбор.

Чтобы назначить контекстную режима действия к длинному щелкните на отдельный элемент, используйте метод setOnItemLongClickListener() на ListView . Этот метод включает в себя информацию о выбранном элементе. В этом методе вы можете начать действия режима.

Следующие примеры показывают, что, он предполагает, что у вас есть меню определен XML файл с названием "rowselection.xml", и что это меню содержит одну запись с "@ + id/menuitem1_show" ID.

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;
 Импорт android.view.ActionMode;
 Импорт android.view.Menu;
 Импорт android.view.MenuInflater;
 Импорт android.view.MenuItem;
 Импорт android.view.View;
 Импорт android.widget.AdapterView;
 Импорт android.widget.AdapterView.OnItemLongClickListener;
 Импорт android.widget.Toast;

 Список общественных MyListActivityActionbar класс расширяет активность {

   охраняемого объекта mActionMode;
   общественных Int SelectedItem = - 1;

   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     setContentView (R.layout.main);
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2", "Ubuntu", "Windows7", "Max OS X", "Linux",
         "OS / 2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS / 2"};

     MySimpleArrayAdapter MySimpleArrayAdapter адаптер = новый (это, ценности);
     setListAdapter (адаптер);

     getListView (). setOnItemLongClickListener (OnItemLongClickListener нового () {

       @ Override
       общественного логический onItemLongClick (адаптер View <> родителей, вид В,
           Int позицию, долгое ID) {

         если (mActionMode = NULL) {
           возвращение ложным;
         }
         SelectedItem = местоположения;

         / / Начало CAB помощью ActionMode.Callback определено выше
         mActionMode = MyListActivityActionbar. этом
             . Начала действия режима (mActionModeCallback);
         view.setSelected (TRUE);
         возвращение истинного;
       }
     });
   }

   частные ActionMode.Callback mActionModeCallback ActionMode.Callback = новый () {

     / / Вызывается при действии режима создано, начало действия режима () была вызвана
     общественного логический onCreateActionMode (Action Mode режим, меню меню) {
       / / Накачайте меню ресурсного обеспечения пунктов контекстного меню
       MenuInflater mode.getMenuInflater инфлятор = ();
       / / Предполагается, что у вас есть "contexual.xml" ресурсы меню
       inflater.inflate (R.menu.rowselection, меню);
       возвращение истинного;
     }

     / / Вызывается каждый раз, когда действие режима показано на рисунке.  Всегда вызывается после
     / / OnCreateActionMode, но,
     / / Может быть вызван несколько раз, если режим недействительным.
     общественного логический onPrepareActionMode (Action Mode режим, меню меню) {
       вернуться ложным / / возвращает ложь, если ничего не будет сделано
     }

     / / Вызывается, когда пользователь выбирает контекстный пункт меню
     общественного логический onActionItemClicked (Action Mode режим, MenuItem пункта) {
       переключателя (item.getItemId ()) {
       R.id.menuitem1_show случае:
         Show ();
         / / Действие выбрали, так близко, CAB
         mode.finish ();
         возвращение истинного;
       по умолчанию:
         возвращение ложным;
       }
     }

     / / Вызывается, когда пользователь выходит из режима действия
     общественных onDestroyActionMode недействительными (режим действий Mode) {
       mActionMode = NULL;
       SelectedItem = - 1;
     }
   };

   частных шоу недействительными () {
     Toast.makeText (это MyListActivityActionbar.,
         String.valueOf (SelectedItem) Toast.LENGTH_LONG) показывают ().
   }

 } 

Если вы начинаете вашу заявку и длительном нажатии на элемент в списке, вы получите ActionBar контекстного меню.

Использование контекстной ActionBar на ListView

Седьмой Реализация состояний для отмены действия

Это хорошая практика, чтобы позволить пользователю отменить критических действий, например, удаление элементов. Хороший образец для этого является предоставление выбора в конце экрана, которая исчезает через некоторое время, или когда пользователь выбирает другой элемент.

Например, Gmail приложение реализует такое поведение.

Кнопка Отменить

Ниже описаны. Пример того, как можно реализовать такое поведение Есть, следовательно, использует анимацию по поэтапному отказу от бутон бар автоматически после небольшого времени.

Создать новый проект для этого примера называется com.vogella.android.userinterface.undo на основе Пустой шаблон шаблон.

Создайте следующий макет для вашей деятельности. Он использует FrameLayout , чтобы показать два разных частях пользовательского интерфейса. Кнопки на панели изначально скрыто. Кнопка использует холст, либо добавить такой холст для вашего проекта или удалить ссылку.

  <FrameLayout XMLNS: андроид = "http://schemas.android.com/apk/res/android"
     XMLNS: инструменты = "http://schemas.android.com/tools"
     Android: layout_width = "match_parent"
     Android: layout_height = "match_parent">

     <RelativeLayout
         Android: layout_width = "match_parent"
         Android: layout_height = "match_parent"
         инструментами: контекст => ". основной деятельности"

         <ListView
             Android: ID = "@ + / ID списка"
             Android: layout_width = "match_parent"
             Android: layout_height = "match_parent">
         </ ListView>
     </ RelativeLayout>

     <LinearLayout
         Android: ID = "@ + ID / undobar"
         Android: видимость = "ушли"
         Android: layout_width = "wrap_content"
         Android: layout_height = "wrap_content"
         Android: layout_gravity = "снизу | center_horizontal"
         Android: layout_margin = "20DP"
         Android: альфа = "100"
         Android: фон = "# 808080"
         Android: dividerPadding = "11dp"
         Android: обивка = "4DP">

         <TextView
             Android: ID = "@ + ID / undobar_message"
             Android: layout_width = "wrap_content"
             Android: layout_height = "wrap_content"
             андроид: текст = "Удаленные"
             Android: textAppearance = "андроид: Attr / textAppearanceMedium"?
             Android: TextColor = "# FFF" />

         Кнопка <
             Android: ID = "@ + ID / undobar_button"
             Android: layout_width = "wrap_content"
             Android: layout_height = "wrap_content"
             Android: layout_marginLeft = "30DP"
             Android: OnClick = "OnClick"
             Android: фон = "# 808080"
             Android: drawableLeft = "@ холст / ic_undobar_undo"
             андроид: текст = "Отменить"
             Android: textAppearance = "андроид: Attr / textAppearanceMedium"?
             Android: TextColor = "# FFF" />
     </ LinearLayout>

 </ FrameLayout> 

Изменение активности Солнца, что он похож на следующий код. Мы повторно ActionBar как созданный шаблон.

  com.vogella.android.userinterface.undo пакет;

 Импорт android.app.Activity;
 Импорт android.os.Bundle;
 Импорт android.view.Menu;
 Импорт android.view.MenuItem;
 Импорт android.view.View;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ListView;
 Импорт android.widget.Toast;

 Импорт com.vogella.android.actionbar.undo.R;

 Открытый класс Главное расширяет активность {активность

   Просмотр просмотра частных контейнера;

   @ Override
   охраняемых недействительными OnCreate (Bundle savedInstanceState) {
     Супер OnCreate (savedInstanceState).
     setContentView (R.layout.activity_main);
     ListView L = (ListView) findViewById (R.id.listview);
     String [] = значение новых String [] {"Ubuntu", "Android", "iPhone"
         "Windows", "Ubuntu", "Android", "iPhone", "Windows"};
     <String> Массива адаптер переходник = новый <String> адаптер Array (это,
         android.R.layout.simple_list_item_ 1, ценности);
     Вид контейнера = findViewById (R.id.undobar);
     l.setAdapter (адаптер);
   }

   @ Override
   общественных onCreateOptionsMenu логическое (меню меню) {
     / / Накачайте меню, это добавляет элементы в панели действий, если он присутствует.
     getMenuInflater () раздувать (R.menu.activity_main, меню).
     возвращение истинного;
   }

   @ Override
   общественного логический onOptionsItemSelected (MenuItem пункта) {
     showUndo (вид контейнера);
     возвращение истинного;
   }

   общественного недействительными OnClick (вид В) {
     Toast.makeText (это, "удаление отменено", Toast.LENGTH_LONG) показывают ().
     viewContainer.setVisibility (View.GONE);
   }

   государственной статической силы showUndo (окончательный вид контейнера View) {
     viewContainer.setVisibility (View.VISIBLE);
     viewContainer.setAlpha (1);
     viewContainer.animate (). альфа (0.4f). setDuration (5000)
         . WithEndAction (Новый Runnable () {

           @ Override
           общественного запустить недействительными () {
             viewContainer.setVisibility (View.GONE);
           }
         });

   }
 } 

Если вы выберите запись в ActionBar панели кнопок становится видимым в течение 5 секунд.

Кнопка Отменить

Восьмой Руководство: Создать список активность

Ниже будет показано, как использовать ListView в ListActivity с заранее заданными ArrayAdapter . класса и существующего макета Android для строк

Создайте новый проект Android называется de.vogella.android.listactivity с Activity называют MyListActivity .

Изменение MyListActivity к следующему. Обратите внимание, что setContentView() метод не используется.

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;
 Импорт android.view.View;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ListView;
 Импорт android.widget.Toast;

 Список общественных MyListActivity класс расширяет активность {
   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     <String> Массива адаптер переходник = новый <String> адаптер Array (это,
         android.R.layout.simple_list_item_ 1, ценности);
     setListAdapter (адаптер);
   }

   @ Override
   охраняемых недействительными onListItemClick (ListView л, вид у, Int позицию, долгое ID) {
     Струнный пункта = (String) getListAdapter () GetItem (должность).
     Toast.makeText (этот пункт + "выбран", Toast.LENGTH_LONG) показывают ().
   }
 } 
Деятельность списке отображаются элементы

Девятый Учебник: Список активность с собственными макета

В нашем примере вашего определит ваш макет для строк и использовать ее в адаптер.

Создание "rowlayout.xml" файл макета в res/layout папки "de.vogella.android.listactivity" проекта.

  <? Xml версия = "1.0" кодировка = "UTF-8">
 <LinearLayout XMLNS: андроид = "http://schemas.android.com/apk/res/android"
     Android: layout_width = "wrap_content"
     Android: layout_height = "wrap_content">

     <ImageView
         Android: ID = "@ + ID / значок"
         Android: layout_width = "22px"
         Android: layout_height = "22px"
         Android: layout_marginLeft = "4px"
         Android: layout_marginRight = "10px"
         Android: layout_marginTop = "4px"
         Android: SRC = "@ холст / ic_launcher">
     </ ImageView>

     <TextView
         Android: ID = "@ + / ID ярлыка"
         Android: layout_width = "wrap_content"
         Android: layout_height = "wrap_content"
         андроид: текст = "@ + / ID ярлыка"
         Android: размер шрифта = "20px">
     </ TextView>

 </ LinearLayout> 

Изменение Activity Солнца, что использование нового формата. Вы можете использовать другой конструктор для определения View , к которым ArrayAdapter присваивает текст. Если ID не Android обеспечивает поиск элементов с @android:id/text1 . ID в расположении строк

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;
 Импорт android.view.View;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ListView;
 Импорт android.widget.Toast;

 Список общественных MyListActivity класс расширяет активность {
   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     / / Используйте свой ​​собственный макет
     <String> Массива адаптер переходник = новый <String> адаптер Array (это,
         R.layout.rowlayout, R.id.label, ценности);
     setListAdapter (адаптер);
   }

   @ Override
   охраняемых недействительными onListItemClick (ListView л, вид у, Int позицию, долгое ID) {
     Струнный пункта = (String) getListAdapter () GetItem (должность).
     Toast.makeText (этот пункт + "выбран", Toast.LENGTH_LONG) показывают ().
   }
 } 
Показано Список с собственным макета

Десятый Учебник: Реализация собственного адаптера

10.1. Определение простой адаптер

Следующие использует два изображения "no.png" и "ok.png". Я поместил его в "RES / холст-MDPI" папку. Вы должны создавать свои собственные иконки. В случае, если Вы не найдете ни одной иконки просто скопировать "icon.png" и использовать программу для рисования, чтобы изменить его немного.

Создать класс MySimpleArrayAdapter whichwill служить нашим адаптером.

  de.vogella.android.listactivity пакет;

 Импорт android.content.Context;
 Импорт android.view.LayoutInflater;
 Импорт android.view.View;
 Импорт android.view.ViewGroup;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ImageView;
 Импорт android.widget.TextView;

 общественных MySimpleArrayAdapter класс расширяет <String> массива адаптер {
   Окончательный частный контекст контексте;
   частных окончательного String [] значения;

   общественных MySimpleArrayAdapter (Context контексте, String [] значения) {
     супер (контекст, R.layout.rowlayout, ценности);
     этом контексте = контекста.
     это значение = значение.
   }

   @ Override
   Посмотреть общественных GetView (INT положение, вид convertView, ViewGroup родителей) {
     LayoutInflater инфлятор = (LayoutInflater) контекст
         . GetSystemService (Context.LAYOUT_INFLATER_SERVICE);
     Посмотреть RowView = inflater.inflate (R.layout.rowlayout, родителей, ложные);
     TextView TextView = (TextView) rowView.findViewById (R.id.label);
     ImageView ImageView = (ImageView) rowView.findViewById (R.id.icon);
     textView.setText (значения [должность]);
     / / Изменить значок для ОС Windows и iPhone
     Струнный S = значение [должность];
     если (s.startsWith ("Windows7") | | s.startsWith ("iPhone")
         | | S.startsWith ("Солярис")) {
       imageView.setImageResource (R.drawable.no);
     Else {}
       imageView.setImageResource (R.drawable.ok);
     }

     RowView вернуться;
   }
 } 

Чтобы использовать этот адаптер, изменения Activity к следующему.

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;

 Список общественных MyListActivity класс расширяет активность {
   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     MySimpleArrayAdapter MySimpleArrayAdapter адаптер = новый (это, ценности);
     setListAdapter (адаптер);
   }

 } 

Если вы запустите этот пример, вы должны получить список с различными иконками для некоторых элементов.

ListView с различными элементами для каждой строки

10.2. Оптимизация производительности

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

Создайте следующий MyPerformanceArrayAdapter класса.

  de.vogella.android.listactivity пакет;

 Импорт android.app.Activity;
 Импорт android.view.LayoutInflater;
 Импорт android.view.View;
 Импорт android.view.ViewGroup;
 Импорт android.widget.ArrayAdapter;
 Импорт android.widget.ImageView;
 Импорт android.widget.TextView;

 общественных MyPerformanceArrayAdapter класс расширяет <String> массива адаптер {
   Окончательный частный контекст деятельности;
   частных окончательного String [] имена;

   Просмотр статических классов Гельдера {
     общественности текст TextView;
     ImageView имиджа;
   }

   общественных MyPerformanceArrayAdapter (Activity контексте, String [] имена) {
     супер (контекст, R.layout.rowlayout, имена);
     этом контексте = контекста.
     это имена = имена.
   }

   @ Override
   Посмотреть общественных GetView (INT положение, вид convertView, ViewGroup родителей) {
     Просмотр RowView = convertView;
     если (RowView == NULL) {
       LayoutInflater инфлятор = context.getLayoutInflater ();
       RowView = inflater.inflate (R.layout.rowlayout, NULL);
       Просмотр просмотра держатель держатель = новый вид держатель ();
       viewHolder.text = (TextView) rowView.findViewById (R.id.TextView01);
       viewHolder.image = (ImageView) RowView
           . FindViewById (R.id.ImageView01);
       rowView.setTag (вид держатель);
     }

     Просмотр держатель держатель = (Посмотреть Holder) rowView.getTag ();
     Струнный S = имена [должность];
     holder.text.setText (ы);
     если (s.startsWith ("Windows7") | | s.startsWith ("iPhone")
         | | S.startsWith ("Солярис")) {
       holder.image.setImageResource (R.drawable.no);
     Else {}
       holder.image.setImageResource (R.drawable.ok);
     }

     RowView вернуться;
   }
 } 

Используйте свой ​​новый адаптер в вашей Activity . Если вы запустите приложение, оно должно выглядеть так же, но это будет намного быстрее, особенно для больших наборов данных.

  de.vogella.android.listactivity пакет;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;

 Список общественных MyListActivity класс расширяет активность {
   общественных OnCreate недействительными (Bundle сосульки) {
     Супер OnCreate (сосульки).
     String [] = значение новых String [] {"Android", "iPhone", "Windows Mobile"
         "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"
         "Linux", "OS / 2"};
     setListAdapter (Новый MyPerformanceArrayAdapter (это, ценностей));
   }

 } 

11 Учебник: Как отображать два элемента в ListView

Вы можете использовать SimpleAdapter класс для отображения данных из двух элементов. Этот класс ожидает массив строк ( from данных), в которой поля ввода данных определены. Поэтому она требует массив целых чисел, который определяет идентификаторы виджетов в макет для строки, в которой эти поля отображаются.

Фактические данные затем список Maps. Карта определяет для каждого поля в данных значение.

В следующем примере показано, к которым Повторное на заранее макет Android для строки.

  de.vogella.android.listactivity пакет;

 Импорт java.util.ArrayList;
 Импорт java.util.HashMap;
 Импорт java.util.Map;

 Импорт android.app.ListActivity;
 Импорт android.os.Bundle;
 Импорт android.widget.SimpleAdapter;

 Список общественных MyTwoListItemsActivity класс расширяет активность {
   охраняемых недействительными OnCreate (Bundle savedInstanceState) {
     Супер OnCreate (savedInstanceState).
     ArrayList <Map <String, String>> Список = сборка данных ();
     String [] с = {"имя", "цель"};
     Int [] = {к android.R.id.text1, android.R.id.text2};

     Простой адаптер адаптер переходник = новый простой (этот список,
         android.R.layout.simple_list_item_ 2, от, до);
     setListAdapter (адаптер);
   }

   частные ArrayList <Map <String, String>> сборка данных () {
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    list.add(putData( "Android" , "Mobile" ));
    list.add(putData( "Windows7" , "Windows7" ));
    list.add(putData( "iPhone" , "iPhone" ));
    return list;
   }

  private HashMap<String, String> putData(String name, String purpose) {
    HashMap<String, String> item = new HashMap<String, String>();
    item.put( "name" , name);
    item.put( "purpose" , purpose);
    return item;
   }
  
 } 

12 Selecting multiple items in the ListView

12.1. Interaction between the model and Listview

Frequently you need to select items in your ListView . As the row of the ListView are getting recycled you cannot store the selection on the View level.

ListView with Interaction and full model

Selection is just one possible example but you can imange other interaction between your row and model.

To persist the selection you have to update your data model with the selected state.

To update the data model in your ListView you define your own Adapter class. In this adapter class you attach a listener to the View which is responsible for selecting the model element. If selected you update the state in the model which you can add as a tag to the View to have access to it.

The following example demonstrates how to use standard Java object and how to interact from the Views with the model.

12.2. Tutorial: Domain Model and Rows interaction

Continue to use the de.vogella.android.listactivity project.

Create the following Model which hold the name and the information if this element is currently selected.

 package de.vogella.android.listactivity;

public class Model {

  private String name;
  private boolean selected;

  public Model(String name) {
    this .name = name;
    selected = false;
   }

  public String getName() {
    return name;
   }

  public void setName(String name) {
    this .name = name;
   }

  public boolean isSelected() {
    return selected;
   }

  public void setSelected( boolean selected) {
    this .selected = selected;
   }

 } 

Create the following new layout file called rowbuttonlayout.xml .

 <?xml version= "1.0" encoding= "utf-8" ?>
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
    android:layout_width= "match_parent"
    android:layout_height= "wrap_content" >

    <TextView
        android:id= "@+id/label"
        android:layout_width= "wrap_content"
        android:layout_height= "wrap_content"
        android:text= "@+id/label"
        android:textSize= "30px" >
    </TextView>

    <CheckBox
        android:id= "@+id/check"
        android:layout_width= "wrap_content"
        android:layout_height= "wrap_content"
        android:layout_alignParentRight= "true"
        android:layout_marginLeft= "4px"
        android:layout_marginRight= "10px" >
    </CheckBox>

</RelativeLayout> 

Create the following Adapter . This adapter adds a listener on the Checkbox view . If the checkbox is selected the underlying data of the model is changed. Checkbox gets the corresponding model element assigned via the getTag() method.

 package de.vogella.android.listactivity;

import java.util.List;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {

  private final List<Model> list;
  private final Activity context;

  public InteractiveArrayAdapter(Activity context, List<Model> list) {
    super (context, R.layout.rowbuttonlayout, list);
    this .context = context;
    this .list = list;
   }

  static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox;
   }

  @Override
  public View getView( int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
      LayoutInflater inflator = context.getLayoutInflater();
      view = inflator.inflate(R.layout.rowbuttonlayout, null);
      final ViewHolder viewHolder = new ViewHolder();
      viewHolder.text = (TextView) view.findViewById(R.id.label);
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
      viewHolder.checkbox
          .setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
              Model element = (Model) viewHolder.checkbox
                  .getTag();
              element.setSelected(buttonView.isChecked());

             }
           });
      view.setTag(viewHolder);
      viewHolder.checkbox.setTag(list.get(position));
     Else {}
      view = convertView;
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
     }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());
    holder.checkbox.setChecked(list.get(position).isSelected());
    return view;
   }
 } 

Finally change your Activity to the following.

 package de.vogella.android.listactivity;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class MyList extends ListActivity {

  
/** Called when the activity is first created. * /
public void onCreate(Bundle icicle) { super .onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity ArrayAdapter<Model> adapter = new InteractiveArrayAdapter( this , getModel()); setListAdapter(adapter); } private List<Model> getModel() { List<Model> list = new ArrayList<Model>(); list.add(get( "Linux" )); list.add(get( "Windows7" )); list.add(get( "Suse" )); list.add(get( "Eclipse" )); list.add(get( "Ubuntu" )); list.add(get( "Solaris" )); list.add(get( "Android" )); list.add(get( "iPhone" )); // Initially select one of the items list.get( 1 ).setSelected(true); return list; } private Model get(String s) { return new Model(s); } }

If you start your app you should be able to flag items. These changes will be reflected in your model.

13 Tutorial: Miscellaneous

13.1. Adding a longclick listener to the list items

You can also add a LongItemClickListener to the View . For this receive the ListView via the getListVIew() method and set the LongItemClickListener via the setOnItemLongClickListener() method.

 package de.vogella.android.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MyList extends ListActivity {

  
/** Called when the activity is first created. * /
public void onCreate(Bundle icicle) { super .onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity String[] names = new String[] { "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" }; ArrayAdapter<String> adapter = new MyPerformanceArrayAdapter( this , names); setListAdapter(adapter); ListView list = getListView(); list.setOnItemLongClickListener( new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MyList. this , "Item in position " + position + " clicked" , Toast.LENGTH_LONG).show(); // Return true to consume the click event. In this case the // onListItemClick listener is not called anymore. return true; } }); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super .onListItemClick(l, v, position, id); // Get the item that was clicked Object o = this .getListAdapter().getItem(position); String keyword = o.toString(); Toast.makeText( this , "You selected: " + keyword, Toast.LENGTH_SHORT) .show(); } }

13.2. Против нескольких single Selection

To get the selected item(s) of a ListView use the getCheckedItemPosition() for a single selection method or listView.getCheckedItemPositions() for multiple selections. . If you have stable ID you could also use the getCheckedItemIds() method to get the selected IDs.

By default a ListView supports only the single selection of a row, but you can activate multi selection via a flag. See the following snippets for examples.

 package de.vogella.android.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MyList extends ListActivity {

  
/** Called when the activity is first created. * /
public void onCreate(Bundle icicle) { super .onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity String[] names = new String[] { "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" , "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" }; setListAdapter( new ArrayAdapter<String>( this , android.R.layout.simple_list_item_multiple_choice, android.R.id.text1, names)); ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); } }
 package de.vogella.android.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MyList extends ListActivity {

  
/** Called when the activity is first created. * /
public void onCreate(Bundle icicle) { super .onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity String[] names = new String[] { "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" , "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" }; setListAdapter( new ArrayAdapter<String>( this , android.R.layout.simple_list_item_single_choice, android.R.id.text1, names)); ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); } }

13.3. ExpandableListView

The ExpandableListView is similar to ListView but allow you to define groups and details for this group. ExpandableListView expects and adapter of type BaseExpandableListAdapter .

13,4. Header and Footer

You can of course put arbitrary Views elements around your ListView. For example you can define a layout with two TextViews and a ListView between them. In this case the two TextViews will always be visible above the List (header) and the other will be visible below the ListView. If you want to display a list header or list footer only at the see the beginning or end of the list you can use the setHeaderView() method or setFooterView() method on ListView .

 package de.vogella.android.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MyList extends ListActivity {

  
/** Called when the activity is first created. * /
public void onCreate(Bundle icicle) { super .onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity String[] names = new String[] { "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" , "Linux" , "Windows7" , "Eclipse" , "Suse" , "Ubuntu" , "Solaris" , "Android" , "iPhone" }; View header = getLayoutInflater().inflate(R.layout.header, null); View footer = getLayoutInflater().inflate(R.layout.footer, null); ListView listView = getListView(); listView.addHeaderView(header); listView.addFooterView(footer); setListAdapter( new ArrayAdapter<String>( this , android.R.layout.simple_list_item_single_choice, android.R.id.text1, names)); } }

Четырнадцатое SimpleCursorAdapter

In case you work with a content provider or directly with the database you can use the SimpleCursorAdapter to define the data for your ListView . The following will demonstrates how to access the Contacts ContentProvider.

Create a new Android project called "de.vogella.android.listactivity.cursor" with the Activity called MyListActivity . Change MyListActivity to the following.

 package de.vogella.android.listactivity.cursor;

import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;

public class MyListActivity extends ListActivity {
  
/** Called when the activity is first created. * /
@Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); Cursor mCursor = getContacts(); startManagingCursor(mCursor); // Now create a new list adapter bound to the cursor. // SimpleListAdapter is designed for binding to a Cursor. ListAdapter adapter = new SimpleCursorAdapter( this , // Context. android.R.layout.two_line_list_item, // Specify the row template // to use (here, two // columns bound to the // two retrieved cursor // rows). mCursor, // Pass in the cursor to bind to. // Array of cursor columns to bind to. new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }, // Parallel array of which template objects to bind to those // columns. new int [] { android.R.id.text1, android.R.id.text2 }); // Bind to our new adapter. setListAdapter(adapter); } 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); } }

Make sure you give your application the permission to read the contacts. (Uses Permissions "android.permission.READ_CONTACTS" in AndroidManifest.xml)

Пятнадцатой Additional Open Source libraries

Sometimes having to press a refresh button on the ActionBar to refresh data can be annoying for the user. Chris Banes has implemented an Open Source library to implement the pull to refresh pattern for a Listview . https://github.com/chrisbanes/Android-PullToRefresh.

Also you may want to use the swipe to dismiss gesture to delete items from a ListView. Jack Wharton provides an Opens Source implementation at https://github.com/JakeWharton/SwipeToDismissNOA