11+

2013-08-13 10 views
17

これは、同じ質問のように百万回に見える...しかし、このためのGoogle検索は、時代遅れのチュートリアルのちょうど束をなした結果を提供しない場合、私はごめんなさいmanagedQueryと他の廃止されたソリューションを使用しています...11+

私はandroid developer training for retrieving a contact listを調べましたが、チュートリアルは不完全であり、サンプルコードをダウンロードすることも役立たないのは、サンプルコードがより高度な連絡先リスト操作(検索など)です。いずれの場合も)

、私はこれは百万回行われていると確信していると私はsのだから私は誰かがここに答えることができます願っていますこれに対する簡単な解決策は存在しない理由はありません何十もの他の初心者のアンドロイド開発者がこれを感謝するでしょう。

私は現れていない連絡先によって私の知る限りのチュートリアルに従っています。私は最大のものは、TO_IDSandroid.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:私のフラグメントのクラスで

:私の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"/> 
私のコードに追加します

私の連絡先_ list_item XML contact_list_layout 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はフラグメントだと言いますが、それがフラグメントであれば、なぜlistviewcontact_list_view.xmlに定義したのですか?

+0

'FROM_COLUMNS、TO_IDS、'マップデータベースの列(各リスト項目に)ビューidをテキストに、[ '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'を表示するコードをいくつか追加しました...私は気付きませんでした'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)からも取得されます。このレイアウトは、アイテムごとに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つのテキストフィールドを持つカスタムリストアイテムレイアウトが必要です。または、単純なものが1つのテキストフィールドに3つのカラムを表示することを許さないので、完全な 'CursorAdapter'を拡張します。 – zapl