List View(列表视图)

列表视图

ListView 是一种可以显示可滚动项目的列表的ViewGroup。使用 Adapter 可以使列表项目会自动插入到列表在中,Adapter 从诸如数组或数据库查询结果的数据源获取数据并且把每个条目转化成可以添加到列表中的视图。

请阅读 Building Layouts with an Adapter 了解如何使用适配器动态的插入视图。

使用加载器


为了避免因为查询阻塞了应用主线程,使用 CursorLoader 是以异步任务查询 Cursor 的标准方式。当 CursorLoader 收到 Cursor 结果时,LoaderCallbacks 会接收到 onLoadFinished() 回调,在这里你使用新的 Cursor 更新你的 Adapter,然后列表视图会显示结果。

尽管 CursorLoader API直到Android 3.0(API等级11)才被引用进来,当支持的设备运行在Android 1.6或更高的平台上时你可以使用 Support Library 以便你的应用使用它们。

请查阅 Loaders 指南了解更多关于使用 Loader 异步加载数据的信息。

事例


下面是使用 ListActivity 的事例,默认情况下这个activity的布局元素只有一个 ListView。它向 Contacts Provider 查询姓名和电话号码列表。

为了使用 CursorLoader 给列表视图动态加载数据,activity需要继承 LoaderCallbacks 接口。

public class ListViewLoader extends ListActivity
        implements LoaderManager.LoaderCallbacks<Cursor> {

    // 被用来显示列表数据的适配器
    SimpleCursorAdapter mAdapter;

    // 需要获取的联系人的一些行信息
    static final String[] PROJECTION = new String[] {ContactsContract.Data._ID,
            ContactsContract.Data.DISPLAY_NAME};

    // 查询条件
    static final String SELECTION = "((" + 
            ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" +
            ContactsContract.Data.DISPLAY_NAME + " != '' ))";

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

        // 创建进度条在列表加载时显示
        ProgressBar progressBar = new ProgressBar(this);
        progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT, Gravity.CENTER));
        progressBar.setIndeterminate(true);
        getListView().setEmptyView(progressBar);

        // 必须将进度条添加到布局的跟视图中
        ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
        root.addView(progressBar);

        // 为适配器指定哪些列的数据插入到哪些视图中
        String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME};
        int[] toViews = {android.R.id.text1}; // simple_list_item_1中的TextView

        // 创建一个我们将要使用来显示加载数据的空的适配器
        // 把null传递给cursor,然后在onLoadFinished()中更新它
        mAdapter = new SimpleCursorAdapter(this, 
                android.R.layout.simple_list_item_1, null,
                fromColumns, toViews, 0);
        setListAdapter(mAdapter);

        // 准备加载器。要么使用已存在的重新连接,要么开启一个新的。
        getLoaderManager().initLoader(0, null, this);
    }

    // 需要创建新的加载器时被调用
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        // 现在创建并返回CursorLoad,它会负责创建显示数据的Cursor
        return new CursorLoader(this, ContactsContract.Data.CONTENT_URI,
                PROJECTION, SELECTION, null, null);
    }

    // 前面创建的加载器完成加载时调用
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        // 换入新的cursor。(一旦我们返回,框架会负责关闭旧的cursor)
        mAdapter.swapCursor(data);
    }

    // 前面创建的加载器被重置时调用,使数据不可用
    public void onLoaderReset(Loader<Cursor> loader) {
        // 当上面用于onLoadFinished()的最后的Cursor将要被关闭时调用。我们需要确保我们不再使用它。
        mAdapter.swapCursor(null);
    }

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) {
        // 点击列表项目时执行
    }
}

注解:由于这个事例是在 Contacts Provider 执行的查询,如果你想要试验这段代码,你的应用必须在清单文件中请求 READ_CONTACTS 权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值