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

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l