当前位置: 首页 > 面试题库 >

如何在Android的Android API 11+中的列表视图中显示联系人

钱照
2023-03-14
问题内容

很抱歉,如果这看起来像是一百万次相同的问题…但是,对此进行的Google搜索没有任何结果,只是一堆使用过时的教程managedQuery以及其他过时的解决方案…

我经历了如何获取联系人列表的android开发人员培训,但是本教程并不完整,即使下载示例代码也无济于事,因为示例代码用于更高级的联系人列表操作(搜索等)。

无论如何,没有理由不应该为此提供一个简单的解决方案,所以我希望有人可以在这里回答,因为我确定这样做已经完成了一百万次了,而且我确定还有数十个其他新手android开发人员会很感激的。

据我所知,本教程未接触到任何人,因此已按照本教程进行操作。我认为最大的是,TO_IDS是一个指向的整数数组android.R.id.text1。我很困惑应该如何以某种方式提取联系人姓名数组。

另外,我很困惑为什么需要一个TextView当最终目标是要显示一个列表视图…在本教程中,我们有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);

我在做什么错,如何在列表视图中简单显示联系人列表?

编辑:添加我的代码:

在我的片段类中:

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"/>

在我的contact_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


问题答案:

精简的小示例,用于在中显示联系人姓名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);
    }
}


 类似资料:
  • 在Android应用程序中,我想在AlertDialog中显示自定义列表视图。 我该怎么做呢?

  • 问题内容: //返回json对象 //我希望listview图片中的此数据也包含在data.please中,请逐步说明//来自Cinemalytics的json数据 ] // movieAdapter类//在getSystemService中显示错误,其余所有代码都可以…。 问题答案: 得到响应后,请遵循以下代码, 首先在所有方法的顶部上方创建以下2个元素。 现在,使用一个适配器在ListView

  • 我在中显示一个网络列表,我希望当我点击一个项目时,它会显示一个请求

  • 我刚刚接触Android,最近我在我的应用程序中添加了一个CardView来显示一些文本框和图像,效果很好。 然而,当我试图显示视频时,卡仍然是空的。有人能帮我理解我做错了什么吗? 我这样定义了图像视图: 最初,我尝试将视频设置为相关活动的onCreate,如下所示: 那不起作用,不知道为什么。所以从相关的中,我使用从URL获取视频。由于UI更改,在onProgressMethod中使用相同的代码

  • 我有一个android布局,它有一个,里面有很多元素。在的底部有一个,然后由适配器填充。 我遇到的问题是,android将从中排除,因为已经具有可滚动的功能。我希望与内容一样长,并且主滚动视图是可滚动的。 我怎样才能达到这种行为呢? 下面是我的主要布局: 然后以编程方式将组件添加到具有ID:的linearlayour中。下面是加载到LinearLayout中的一个视图。就是这个给我卷轴带来麻烦的。