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

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加