ITKeyword,专注技术干货聚合推荐

注册 | 登录

List View(列表视图)

yh_android_blog 分享于 2016-07-24

推荐:2012.9.26 安卓游戏开发笔记(十一)_View视图

View游戏框架: 1.继承View这个类,重写绘图函数void  Draw(0;重写按键按下事件onKeyDown();重写按键抬起事件onKeyUp();重写触屏事件函数 2. 绘图函数无论是图形/

2020腾讯云8月秒杀活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

概述

列表视图是一个视图组,它以可滑动列表的方式展示了许多项目。列表项通过使用一个 Adapter  来自动填充,适配器( Adapter   )将数据从源端(例如一个数组或数据库的查询结果)提取内容并将内容填入每一个项目中去。 如何使用适配器来填充数据,请阅读 Building Layouts with an Adapter .

使用装填器(Loader )

使用CursorLoader  是标准的用来查询异步任务中游标( Cursor )的方法,可以避免阻塞你app的主线程。当 CursorLoader接受了 Cursor的结果, LoaderCallbacks收到一个 onLoadFinished()回调, onLoadFinished()在你的适配器有新的游标和列表视图需要显示结果并更新你的适配器时被调用。 更多关于如何使用loader 的方法,请查阅   Loaders开发向导(app components /activities )。

Example

下面用一个 ListActivity ,举例,这是一个只包含了listview 的activity 。它为   Contacts Provider  执行了一个查询名字和电话号码的操作。 这个activity 实现了 LoaderCallbacks  接口,为了使用 CursorLoader  来为list view 动态加载视图。
   
    
     public class ListViewLoader extends ListActivity
    
    
      implements LoaderManager.LoaderCallbacks<Cursor> {
    
    
      
    
    
      // 这是一个被用来展示列表数据的adapter 
    
    
      SimpleCursorAdapter mAdapter;
    
    
      
    
    
      // 这是我们将要查找的内容(contacts)列
    
    
      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);
    
    
      
    
    
      // 使用游标适配器(cursor adapter), 指定哪一列与哪一个视图相匹配
    
    
      String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME};
    
    
      int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1
    
    
      
    
    
      // 创建一个空的适配器,我们将用它来展示加载的数据
    
    
      // 我们为游标参数传递了null, 然后在 onLoadFinished()中更新它
    
    
      mAdapter = new SimpleCursorAdapter(this, 
    
    
      android.R.layout.simple_list_item_1, null,
    
    
      fromColumns, toViews, 0);
    
    
      setListAdapter(mAdapter);
    
    
      
    
    
      // 准备加载器(loader). 重新连接一个已经存在的或开启一个新的。
    
    
      getLoaderManager().initLoader(0, null, this);
    
    
      }
    
    
      
    
    
      // 当一个新的加载器被创建时调用
    
    
      public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    
    
      // 现在,创建并返回一个CursorLoader,它只处理创建一个数据显示的游标
    
    
      return new CursorLoader(this, ContactsContract.Data.CONTENT_URI,
    
    
      PROJECTION, SELECTION, null, null);
    
    
      }
    
    
      
    
    
      // 当事先创建的加载器已经完成加载时调用
    
    
      public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    
    
      // 交换新游标 (一旦我们返回,框架将会处理关闭老的游标
     )
    
    
      mAdapter.swapCursor(data);
    
    
      }
    
    
      
    
    
      // 当预先创建的加载器被重新设置时调用,让数据不可用
    
    
      public void onLoaderReset(Loader<Cursor> loader) {
    
    
      //当最后的游标提供给onLoadFinished()并关闭时调用
    
    
      // 我们需要确保再也不会使用它了
    
    
      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" />

 使用适配器创建布局(Building Layouts with an Adapter)

当你的layout内容是动态的或者不是事先确定的,你就可以在使用AdapterView的子类在运行时去填充layout。AdapterView的一个子类可以使用一个Adapter来把数据捆绑到layout上。 这个Adapter发挥着数据源和 AdapterViewLayout之间的“中间人”的作用-- Adapter获取数据(从一个比如数组或者数据库查询之类的来源),然后把每一个条目转变成能被添加到 AdapterViewLayout里的view(的内容)。

常见的被Adapter支持的layout如下:

List View

显示一个可滚动的单列列表。

Grid View

显示一个可滚动的行列组成的网格。

Filling an adapter view with data

你可以为Adapter绑定AdapterView 以此来填充ListView或者 GridView,这个 Adapter从外部资源中获取数据,创建一个代表着每一个数据条目的View
Android提供了一些对提取不同类型数据以及为AdapterView创建view有用的 Adapter的子类。如下是两个最常用的Adapter:
ArrayAdapter
当你的数据源是数组的时候使用这个Adapter。默认情况下,  ArrayAdapter靠  为每一个数组项调用  toString()和把内容放置在  TextView 的方式为每一个数组项创建一个view。

举个例子:如果你有一个想要展示在ListView的字符串数组,用构造器初始化一个新的 ArrayAdapter来为每一个字符串或字符串数组指定layout:

ArrayAdapter adapter = new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, myStringArray);

这个构造器的参数是:

  • 你的app的上下文。
  • 包含了为数组中每个字符串指定内容的TextView的layout。
  • 字符串数组。

然后简单地在你的ListView中调用 setAdapter()

ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

为了定制每一个条目的外观,你可以为数组中每个对象重写toString()方法。或者,为了给每一个不是TextView的条目创建view, (举例来说,如果你想为每一个数组项建立ImageView)你要为每个item继承ArrayAdapter类并重写getView()方法来返回你想要view类型。

SimpleCursorAdapter
当你的数据来自于一个 Cursor的时候使用这个Adapter。 当使用 SimpleCursorAdapter的时候,你必须为cursor中每一行指定一个Layout以及cursor中的哪一列应该被插入到layout的哪一个view中去。 举例来说,如果你想创建人们名字和电话号码的列表,你就可以执行一个返回包含了一个  Cursor的查询,在这个 Cursor中,每行为一个人,列包含人名,电话号码之类的信息。 然后你就可以创建一个在layout中指定你想要的 Cursor的哪些列的字符串数组,以及指定对应的每一列应当被放置的所在的view 的整形数组:

String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};int[] toViews = {R.id.display_name, R.id.phone_number};

当你实例化SimpleCursorAdapter类的时候, 传递layout给Cursor包含的每一个result使用。然后这两个数组:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);ListView listView = getListView();
listView.setAdapter(adapter);

然后SimpleCursorAdapter就会使用提供的layout将每一个fromColumns插入到对应的toViews view中,并以此在Cursor中为每一行创建view。

如果在你的应用的生命周期当中,你改变了底层可以被Adapter读取的数据,你应该调用notifyDataSetChanged()。 这样能够通知哪些相关的view:数据已经改变了,是时候刷新了。

Handling click events

你可以实现AdapterView.OnItemClickListener接口在 AdapterView的每一个item上回应点击事件。

// Create a message handling object as an anonymous class.private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {public void onItemClick(AdapterView parent, View v, int position, long id) {// Do something in response to the click}};

listView.setOnItemClickListener(mMessageClickedHandler); 
本小结来源: http://android-doc.com/guide/topics/ui/declaring-layout.html#AdapterViews

推荐:安卓小渣渣的成长之路1.0——使用SimpleCursorAdapter添加列表视图内容(获取手机通讯录名字)

首先声明本人对安卓一窍不通,但是为了实习,为了工作,只能凭借着原来的java基础去学习安卓(貌似java也是自学的,只有c才是我的基础啊~~~~)。 今天是我第一次

概述 列表视图是一个视图组,它以可滑动列表的方式展示了许多项目。列表项通过使用一个 Adapter  来自动填充,适配器( Adapter   )将数据从源端(例如一个数组或数据库的查询结果)提取内容并将内

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。