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

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方