2013-08-13 1 views
17

Прошу прощения, если это похоже на один и тот же вопрос в миллион раз ... но поиск в Google для этого не дает результатов, просто куча устаревших руководств используя managedQuery и другие устаревшие решения ...как отображать контакты в списке в Android для Android api 11+

Я прошел через android developer training for retrieving a contact list, но учебник неполный, и даже загрузка образца кода не помогает, потому что примерный код предназначен для более продвинутых манипуляций со списком контактов (поиск и т. д.).)

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

Я слежу за учебником, насколько мне известно, контакты не появляются. Я думаю, самое главное, что TO_IDS представляет собой целочисленный массив, который указывает на android.R.id.text1. Я смущен тем, как это должно каким-то образом вытащить массив имен контактов.

Кроме того, я смущен, почему текстовое представление необходимо, когда конечная цель состоит в отображении списка ... В учебнике у нас есть mContactsList, который представляет собой представление списка ... Но мы заполняем представление списка с помощью адаптер, указывающий на R.layout.contact_list_item, который является только текстовым просмотром, заполненным TO_IDS, массивом целых чисел.

mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); 
mCursorAdapter = new SimpleCursorAdapter(
      getActivity(), 
      R.layout.contact_list_item, 
      null, 
      FROM_COLUMNS, TO_IDS, 
      0); 
mContactList.setAdapter(mCursorAdapter); 

Что я делаю неправильно и как просто отображать список контактов в списке?

EDIT: добавление в мой код:

в моем классе фрагмент:

public class MyFragment extends Fragment implements 
    LoaderManager.LoaderCallbacks<Cursor>{ 

private static final String[] FROM_COLUMNS = {ContactsContract.Contacts.DISPLAY_NAME_PRIMARY }; 
private static final int[] TO_IDS = {android.R.id.text1}; 
ListView mContactList; 
private SimpleCursorAdapter mCursorAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    return inflater.inflate(R.layout.contact_list_view,container,false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 
    mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); 
    mCursorAdapter = new SimpleCursorAdapter(
      getActivity(), 
      R.layout.contact_list_item, 
      null, 
      FROM_COLUMNS, TO_IDS, 
      0); 
    mContactList.setAdapter(mCursorAdapter); 

} 

@Override 
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
    return null; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 

} 

@Override 
public void onLoaderReset(Loader<Cursor> cursorLoader) { 

} 
} 

в моем activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <fragment 
      android:id ="@+id/contactListFragment" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:name="preamble.myapp.MyFragment"/> 
</LinearLayout> 

в моем contact_list_view XML:

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

В моем контакте_ list_item XML

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

, наконец, для contact_list_layout XML:

Что я положил в contact_list_layout.xml? Это просто пустой <LinearLayout>? В учебнике не ясно, как обрабатывается этот xml. Он говорит, что этот XML является фрагментом, но если это фрагмент, почему мы определили listview уже в contact_list_view.xml?

+0

'FROM_COLUMNS, TO_IDS,' столбцы карты базы данных в текстовом просматривать идентификаторы (в каждом элементе списка), см [ 'SimpleCursorAdapter'] (http://developer.android.com/reference/android/widget/SimpleCursorAdapter .html # SimpleCursorAdapter% 28android.content.Context,% 20int,% 20android.database.Cursor,% 20java.lang.String [],% 20int [],% 20int% 29).Что-то нужно загрузить данные курсора, чтобы использовать это, а это не в вашем фрагменте кода. – zapl

+0

@zapl. Я добавил некоторые из моего кода, чтобы показать вам мои 'FROM_COLUMNS' и' TO_IDS' ... Я заметил, что у меня нет a 'contact_list_layout.xml', и у меня есть' activity_main.xml' ... Можете ли вы рассказать мне, как структурирован 'contact_list_layout.xml'? Можете ли вы просмотреть мои xml-файлы? У меня такое чувство, что я чего-то не хватает, и как только я подумаю, что одна часть его будет работать. В учебнике не показано, как написано contact_list_layout.xml, так что, возможно, именно там я ошибаюсь? –

+0

@zapl Я получаю исключение с нулевым указателем в 'mContactList.setAdapter (mCursorAdapter);' –

ответ

20

Маленький урезанный пример для отображения имени контакта в ListView. Ниже Fragment расширяет ListFragment, который имеет макет по умолчанию. Вам не нужно указывать свои собственные. Макет элементов списка также берется из макетов по умолчанию Android (android.R.layout.simple_list_item_1), который представляет собой простую единую строку текста для каждого элемента.

import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract.Contacts; 
import android.support.v4.app.ListFragment; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.CursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter; 

public class ContactListFragment extends ListFragment implements LoaderCallbacks<Cursor> { 

    private CursorAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // create adapter once 
     Context context = getActivity(); 
     int layout = android.R.layout.simple_list_item_1; 
     Cursor c = null; // there is no cursor yet 
     int flags = 0; // no auto-requery! Loader requeries. 
     mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // each time we are started use our listadapter 
     setListAdapter(mAdapter); 
     // and tell loader manager to start loading 
     getLoaderManager().initLoader(0, null, this); 
    } 

    // columns requested from the database 
    private static final String[] PROJECTION = { 
     Contacts._ID, // _ID is always required 
     Contacts.DISPLAY_NAME_PRIMARY // that's what we want to display 
    }; 

    // and name should be displayed in the text1 textview in item layout 
    private static final String[] FROM = { Contacts.DISPLAY_NAME_PRIMARY }; 
    private static final int[] TO = { android.R.id.text1 }; 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 

     // load from the "Contacts table" 
     Uri contentUri = Contacts.CONTENT_URI; 

     // no sub-selection, no sort order, simply every row 
     // projection says we want just the _id and the name column 
     return new CursorLoader(getActivity(), 
       contentUri, 
       PROJECTION, 
       null, 
       null, 
       null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     // Once cursor is loaded, give it to adapter 
     mAdapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     // on reset take any old cursor away 
     mAdapter.swapCursor(null); 
    } 
} 
+0

спасибо, много помогли, можете ли вы рассказать мне, как мы можем показать адрес электронной почты и номер вместе с именем контактов тем же способом. –

+0

@JagdeepSingh Не уверен, как получить все данные, кроме электронной почты, насколько я могу видеть, содержащиеся в [ContactsContract.Data] (http://developer.android.com/reference/android/provider/ContactsContract.Data.html) Таблица. Может быть достаточно, чтобы изменить URI на эту таблицу и добавить столбец электронной почты + номер телефона в проекцию. Также вам понадобится макет настраиваемого списка элементов с 3 текстовыми полями для отображения 'FROM'>' TO' или расширения полностью выдутого 'CursorAdapter', поскольку простой не позволяет отображать 3 столбца в 1 текстовом поле. – zapl