Android 2.2 API Demos -- ListActivity

2024-03-25 02:18

本文主要是介绍Android 2.2 API Demos -- ListActivity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天仔细研究了一下API Demo中的QuickContactsDemo示例,感觉对ListActivity有了进一步的认识。下面结合官方文档和自己的研究对ListActivity做个总结。

Screen Layout

ListActivity的默认布局由一个位于屏幕中心的全屏列表构成。如果你不想使用默认的布局,可以在onCreate()方法中通过setContentView()方法设定你自己的布局。

如果指定你自己定制的布局,你的布局中必须包含一个id为"@id/android:list"的ListView。 若你还指定了一个id为"@id/android:empty"的view,当ListView中没有数据要显示时,这个view就会被显示,同时 ListView会被隐藏。

参考示例:

1. 布局文件,res/layout/main.xml。
Xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="8dp"android:paddingRight="8dp"><!-- 除了ListView和id为@id/android:empty的view之外,我们还可以任意添加view --><TextView android:id="@+id/android:title" android:layout_width="match_parent"android:layout_height="wrap_content" android:text="The following is a list:" /><!-- id为@id/android:list的ListView为客户化的list布局,如果没有,则系统会调用默认的布局 --><ListView android:id="@id/android:list" android:layout_width="match_parent"android:layout_height="match_parent" android:background="#00FF00"android:layout_weight="1" android:drawSelectorOnTop="false" /><!-- 当ListView中没有数据时,id为@id/android:empty的view就会显示出来 --><TextView android:id="@id/android:empty" android:layout_width="match_parent"android:layout_height="match_parent" android:textColor="#FF0000"android:text="No data" android:gravity="center_vertical|center_horizontal" />
</LinearLayout>


2. Activity对应的Java文件,ListActivityDemo.java。
Java代码

package com.xeedroid;import java.util.ArrayList;
import java.util.List;import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;public class ListActivityDemo extends ListActivity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);List<String> items = fillList();ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);setListAdapter(adapter);}private List<String> fillList() {List<String> items = new ArrayList<String>();items.add("星期一");items.add("星期二");items.add("星期三");items.add("星期四");items.add("星期五");items.add("星期六");items.add("星期日");//items.clear();return items;}}


 


3. 运行效果如下:

 

4. 放开java代码中的"items.clear();"的注释。使得ListView绑定的数据源没有数据。运行效果如下:

 

从运行结果上也可以看出绿色背景的ListView没有显示。

 

Row Layout

Android允许为列表中一个单独的行指定布局。只要在ListAdapter对象中指定一个布局资源就可以了。

一个ListAdapter构造函数有一个参数来指定每一行的布局资源。此外,它还有另外两个参数来指定哪一个数据域与行布局资源中的对象相关联。这两个参数一般是平行数组。

Android在R.layout类中提供了一些标准的布局资源。例如simple_list_item_1, simple_list_item_2, 和two_line_list_item。

参考示例一(使用SimpleCursorAdapter):

1. 使用默认的布局。

2. Activity对应的Java代码如下。
Java代码

package com.xeedroid;import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;public class ListActivityDemo extends ListActivity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Cursor mCursor = this.getContentResolver().query(Contacts.CONTENT_URI,null, null, null, null);startManagingCursor(mCursor);ListAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.two_line_list_item, mCursor, new String[] {Contacts.DISPLAY_NAME, Contacts.TIMES_CONTACTED }, new int[] {android.R.id.text1, android.R.id.text2 });setListAdapter(adapter);}}


客户化的行布局使用了系统的android.R.layout.two_line_list_item。

3. 运行效果如下:

 

参考示例二(使用ResourceCursorAdapter):

1. 使用系统默认screen layout。

2. Activity对应的Java代码QuickContactsDemo.java(带注释)如下:
Java代码

package com.example.android.apis.app;import com.example.android.apis.R;import android.app.ListActivity;
import android.content.Context;
import android.database.CharArrayBuffer;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.view.View;
import android.view.ViewGroup;
import android.widget.QuickContactBadge;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;public class QuickContactsDemo extends ListActivity {static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {Contacts._ID, // 0Contacts.DISPLAY_NAME, // 1Contacts.STARRED, // 2Contacts.TIMES_CONTACTED, // 3Contacts.CONTACT_PRESENCE, // 4Contacts.PHOTO_ID, // 5Contacts.LOOKUP_KEY, // 6Contacts.HAS_PHONE_NUMBER, // 7};static final int SUMMARY_ID_COLUMN_INDEX = 0;static final int SUMMARY_NAME_COLUMN_INDEX = 1;static final int SUMMARY_STARRED_COLUMN_INDEX = 2;static final int SUMMARY_TIMES_CONTACTED_COLUMN_INDEX = 3;static final int SUMMARY_PRESENCE_STATUS_COLUMN_INDEX = 4;static final int SUMMARY_PHOTO_ID_COLUMN_INDEX = 5;static final int SUMMARY_LOOKUP_KEY = 6;static final int SUMMARY_HAS_PHONE_COLUMN_INDEX = 7;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 查找符合条件的所有contactString select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("+ Contacts.DISPLAY_NAME + " != '' ))";Cursor c =getContentResolver().query(Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select,null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");// 将cursor交给Activity管理startManagingCursor(c);// 创建adapter,将客户化的UI和要显示的数据与adapter绑定ContactListItemAdapter adapter = new ContactListItemAdapter(this, R.layout.quick_contacts, c);// 将adapter和当前list activity绑定setListAdapter(adapter);}/** ResourceCursorAdapter主要是将数据按照ListActivity的要求传递给它。它的祖宗类实现了List Adapter接口。* 在对ListActivity界面进行渲染过程中,对于Cursor中每一条记录都会依次调用newView和bindView方法来生成UI。*/private final class ContactListItemAdapter extends ResourceCursorAdapter {public ContactListItemAdapter(Context context, int layout, Cursor c) {super(context, layout, c);}// 将newView生成的view和当前cursor指定的数据绑定@Overridepublic void bindView(View view, Context context, Cursor cursor) {final ContactListItemCache cache = (ContactListItemCache) view.getTag();TextView nameView = cache.nameView;QuickContactBadge photoView = cache.photoView;// Set the namecursor.copyStringToBuffer(SUMMARY_NAME_COLUMN_INDEX, cache.nameBuffer);int size = cache.nameBuffer.sizeCopied;cache.nameView.setText(cache.nameBuffer.data, 0, size);final long contactId = cursor.getLong(SUMMARY_ID_COLUMN_INDEX);final String lookupKey = cursor.getString(SUMMARY_LOOKUP_KEY);cache.photoView.assignContactUri(Contacts.getLookupUri(contactId, lookupKey));}// 按照ContactListItemAdapter(Context context, int layout, Cursor c)中的layout生成view@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {View view = super.newView(context, cursor, parent);ContactListItemCache cache = new ContactListItemCache();cache.nameView = (TextView) view.findViewById(R.id.name);cache.photoView = (QuickContactBadge) view.findViewById(R.id.badge);// Tag用于传递任意对象,将当前方法生成的view中的子view以参数的形式暴露,供bindView()调用view.setTag(cache);return view;}}/** 自定义的数据结构,用于存储newView()所生成的view中的元素(各个子view)*/final static class ContactListItemCache {public TextView nameView;public QuickContactBadge photoView;public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);}
}


3. 行布局对应的资源文件,res/layout/quick_contacts.xml。
Xml代码

<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:paddingLeft="0dip"android:paddingRight="9dip"android:layout_height= "wrap_content"android:minHeight="48dip"><QuickContactBadgeandroid:id="@+id/badge"android:layout_marginLeft="2dip"android:layout_marginRight="14dip"android:layout_marginTop="4dip"android:layout_marginBottom="3dip"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_height= "wrap_content"android:layout_width= "wrap_content"android:src="@drawable/ic_contact_picture"style="?android:attr/quickContactBadgeStyleWindowSmall" /><TextViewandroid:id="@+id/name"android:textAppearance="?android:attr/textAppearanceMedium"android:paddingLeft="2dip"android:layout_centerVertical="true"android:layout_toRightOf="@id/badge"android:layout_width="match_parent"android:layout_height="wrap_content" /></RelativeLayout>


ListActivity会根据row对应的layout文件和数据逐渐渲染生成整个UI。

4. 运行效果如下:

Binding to Data

我们通过实现了ListAdapter的类的对象向ListView传递数据。

主要被使用的类有:SimpleAdapter,ArrayAdapter,SimpleCursorAdapter,ResourceCursorAdapter(用其子类)。

SimpleCursorAdapter,ResourceCursorAdapter(抽象类)都是CursorAdapter的子类。在 CursorAdapter中有两个方法:newView()和bindView()方法,newView方法用来创建一个 RowLayout,bindView方法用来向这个新的RowLayout绑定数据。需要使用ResourceCursorAdapter是因为有些数据不能用SimpleCursorAdapter来进行绑定。

 

 

其实我们不继承ListActivity也可以实现list的效果。

参考示例:

1. 创建layout文件,res/layout/main.xml,如下:
Xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="8dp"android:paddingRight="8dp"><TextView android:id="@+id/android:title" android:layout_width="match_parent"android:layout_height="wrap_content" android:text="The following is a list:" /><ListView android:id="@+id/lv" android:layout_width="match_parent"android:layout_height="wrap_content" android:background="#00FF00"android:layout_weight="1" android:drawSelectorOnTop="false" />
</LinearLayout>


2. 创建Activity对应的Java代码,ListActivityDemo.java,如下:
Java代码

package com.xeedroid;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;/*** 继承Activity,not ListActivity*/
public class ListActivityDemo extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载layout资源文件,其中包含一个ListViewsetContentView(R.layout.main);// 为ListView绑定数据ListView lv = (ListView) findViewById(R.id.lv);List<String> items = fillList();ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, items);lv.setAdapter(adapter);OnItemClickListener listener = new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {setTitle(parent.getItemAtPosition(position).toString());}};lv.setOnItemClickListener(listener);}private List<String> fillList() {List<String> items = new ArrayList<String>();items.add("星期一");items.add("星期二");items.add("星期三");items.add("星期四");items.add("星期五");items.add("星期六");items.add("星期日");// items.clear();return items;}}


3. 运行效果如下,点击列表中的选项,Activity标题会随之改变:

 

由于ListActivityDemo继承的不是ListActivity,即使在资源文件创建了id为"@id/android:list"的 ListView或者id为"@id/android:empty"的view,都不会起到在ListActivity中的作用,因为没有 ListActivity去管理它们。

总结:在上面的示例中,我们只是用到了ListView这个控件实现了列表的效果,而没有用ListActivity去对ListView进行自动管理,所以失去了很多方便之处,例如,我们需要手动将listview和listener进行绑定,lv.setOnItemClickListener(listener)。

 

 

这篇关于Android 2.2 API Demos -- ListActivity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843550

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期