2013-08-13 2 views
17

백만 번 같은 질문인데 죄송하지만 ... Google 검색은 아무런 결과도 얻지 못합니다. 오래된 튜토리얼 만 남았습니다. managedQuery 및 다른 사용되지 않는 솔루션을 사용 중입니다 ...안드로이드에서 안드로이드 용리스트 뷰에 연락처를 표시하는 방법 api 11+

을 통과했지만 샘플 코드가 고급 연락처 목록 조작 (검색 등)을 위해 있기 때문에 튜토리얼이 불완전 해지고 샘플 코드를 다운로드해도 도움이되지 않습니다.)

어쨌든 이것에 대한 간단한 해결책이 없어야하는 이유는 없습니다. 그래서 나는 이것이 백만 번 행해졌 음을 확신하고 있기 때문에 누군가 대답 할 수 있기를 바라고 있습니다. 수십 명의 다른 안드로이드 개발자가이 점을 인정할 것입니다.

연락처가 표시되지 않아서 최고의 지식으로 튜토리얼을 따라했습니다. 가장 큰 문제는 TO_IDSandroid.R.id.text1을 가리키는 정수 배열이라는 것입니다. 어떻게 든 연락처 이름 배열을 가져 오지 않으면 어떻게 될지 혼란 스럽습니다.

또한 최종 목표가 목록보기를 표시 할 때 텍스트보기가 필요한 이유가 혼란 스럽습니다 ... 튜토리얼에서 목록보기 인 mContactsList가 있습니다 ... 그러나 목록보기에 어댑터는 R.layout.contact_list_item을 가리키며, 이는 정수 배열 인 TO_IDS로 채워진 textviews입니다.

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); 

내가 뭘 잘못하고 있으며 어떻게 단순히 연락처 목록을 목록보기에 표시합니까?

편집 : 내 조각 클래스의

: 내 activity_main.xml에서

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) { 

} 
} 

: 내 contact_list_view 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> 

:

<?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"/> 
내 코드에 추가

내 연락처 _ 마지막으로 contact_list_layout의 XML에 대한 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에 넣어 무엇을? 이것은 단지 비어 있습니까 <LinearLayout>? 이 xml이 어떻게 처리되는지는 자습서에서 명확하지 않습니다. 그것은이 XML이 조각이라고 말하지만 조각 인 경우 왜 에 listview을 정의 했습니까?

+0

'FROM_COLUMNS는 TO_IDS은'(각 목록 항목에서)보기 ID를 텍스트로지도 데이터베이스 열, http://developer.android.com/reference/android/widget/SimpleCursorAdapter (['SimpleCursorAdapter'] 참조 .html # SimpleCursorAdapter % 28android.content.Context, % 20int, % 20android.database.Cursor, % 20java.lang.String [], % 20int [], % 20int % 29).뭔가 코드를 사용하기 위해 커서 데이터를로드해야합니다. – zapl

+0

@zapl 'FROM_COLUMNS' 및'TO_IDS'을 (를) 표시하는 코드를 일부 추가했습니다 ... 내가 갖고 있지 않은 것으로 나타났습니다. 'contact_list_layout.xml'과 저는'activity_main.xml'을 가지고 있습니다 ... 당신이'contact_list_layout.xml'이 어떻게 구성되어 있는지 말해 줄 수 있습니까? 내 xml 파일을 검토 할 수 있습니까? 나는 내가 놓친 뭔가가 있다는 느낌을 가지고 있으며, 일단 그것이 작동한다고 생각하면, 이 튜토리얼에서는 contact_list_layout.xml이 어쩌면 내가 실수를하고있는 곳에서 쓰여지는지 보여주지 않는다. –

+0

@zapl mContactList.setAdapter (mCursorAdapter);에서 null 포인터 예외가 발생했습니다. –

답변

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를 해당 테이블로 변경하고 이메일 + 전화 번호 열을 프로젝션에 추가하는 것으로 충분할 수 있습니다. 또한 'FROM'>'TO'매핑을 위해 3 개의 텍스트 필드가있는 사용자 정의 목록 항목 레이아웃이 필요하거나 간단한 텍스트 필드에 3 개의 열을 표시 할 수 없으므로 완전한 CursorAdapter를 확장 할 수 있습니다. – zapl