Android - 待办事项\购物清单





5.00/5 (2投票s)
本技巧介绍了如何使用 ListView、SQLite、对话框和自定义适配器创建一个待办事项或购物清单应用。
引言
本技巧展示了如何创建一个购物清单/待办事项列表应用程序。它提供了以下方面的思路:
- 在 Activity 中添加列表项
- 从 Android Activity 打开对话框
- 使用 SQLite
- 如何将数据从一个 Activity 返回到另一个 Activity
在本技巧中,我们将讨论前两点。
开始
本技巧假定您已了解如何创建 Android 项目。请使用以下详细信息创建一个新的 Android 项目:
- 应用名称 = UtilityPlus 项目名称 = UtilityPlus 包名 = com.utility.utilityplus
- 最低必需 SDK 和目标 SDK = API 11 Android 3.0 (HoneyComb),然后点击完成。
活动和资源
此应用程序包含以下主要组件:
MainActivity
- 显示现有的购物清单/待办事项列表Dialog
- 一个弹出窗口,用于向用户询问列表名称- 添加新数据 Activity - 用户在此处输入列表内容。
Adapter
- 用于在MainActivity
中显示数据DatabaseHelper
- 用于连接和与MainApplication
进行通信
Using the Code
在 Activity 中添加列表项
在继续之前,我们需要理解几个正在使用的基本概念:
- ListView - 显示可滚动且逻辑相关的项列表。它是重要的 UI 组件,在许多应用程序中用于各种目的。
- ListView Item - 在单行中显示的项/数据。它可以是纯文本(例如,显示联系人姓名),也可以更复杂,包含 2 个用于姓名和号码的
EditText
,以及用于编辑和删除的 2 个按钮。 - 数据源 - 数据源的网络定义为:“获取数据的来源,如人员、文档、产品、活动、事件和记录。” [参考:http://www.evaluationtoolkit.org/glossary]
在编码方面,它可以是ArrayList
、任何数据类型(基本类型或复杂类型)的数组。 - Adapter - 一段代码,它从数据源获取数据,并使其与
ListView
兼容。
实际上,ListView
与其适配器之间的关系要复杂得多。
在 ListView 中显示纯文本作为列表项
- 在资源布局 XML 中添加
ListView
- 创建/查找数据源
- 为数据源创建一个
Adapter
- 将
Adapter
分配给ListView
完成!
ListView
可以从资源 XML 的图形显示左侧面板拖动,或者可以将以下代码复制到 XML 视图中。
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
数据源:此处,我们使用一个 String
数组。
String[] strNoData = { "Item1", "Item2", "Item3" };//DataSource
适配器:我们使用简单的 arrayAdapter
,然后使用 setAdapter
将 adapter
设置到 listview
中。
ArrayAdapter<string> objAdapter = new ArrayAdapter<string>(this,
android.R.layout.simple_list_item_1, android.R.id.text1,
strDataSource);
listview.setAdapter(objAdapter);</string> </string>
在 ListView 中将一组控件显示为列表项
步骤
- 在资源布局 XML 中添加
ListView
- 创建/查找数据源
- 在
ListView
的行模板中创建一个 XML 布局资源 - 为数据源创建一个
Adapter
- 将
Adapter
分配给ListView
完成!!!
ListView
行模板的 XML 布局资源。以下模板将用于 ListView
中的所有行。
<LinearLayout ...
<FrameLayout ...
<TextView android:id="@+id/textView_datetime"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="" android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="left"/>
<Button android:id="@+id/button_Edit" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="@+string/str_edit"
android:onClick="onClick" android:layout_gravity="center_horizontal"/>
<Button android:id="@+id/button_delete" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:text="@+string/str_delete"
android:layout_gravity="right" android:onClick="onClick"/>
</FrameLayout>
<TextView android:id="@+id/textView_notename" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text=""
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="bottom"/>
</LinearLayout>
创建自定义适配器
我们可以扩展 Android 提供的任何 adapter
类来创建自己的自定义适配器。在这里,我们将使用 ArrayAdapter
类。在适配器中,我们需要重写 getView
方法。此方法将返回单行的视图。请参阅下面的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater vi = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.showlistrow, null);
ShowData showData = m_ListItems.get(position);
if (showData != null) {
try {
//Write code to display the controls in the layout XML
} catch (Exception ex) {
...
}
}
return convertView;
}
现在,上面的代码是正确的,但我们可以进一步优化它。我们可以重用屏幕上不可见的 ListItems
的视图。
假设屏幕上可以显示 5 个 Listitem
。我们将为每个项目创建一个新视图。目前,内存中有 5 个视图。
当我们向下滚动 listitem
时,第一个 ListItem
将不再显示,而第六个 ListItem
将进入视图。因此,我们不需要为第六个项目创建一个新视图,而是可以重用第一个项目的视图。在 Android 中创建新视图的开销很大,只需添加一个检查现有视图的逻辑即可。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView!=null) { //Check added for optimizing the code.
LayoutInflater vi = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.showlistrow, null);
ShowData showData = m_ListItems.get(position);
if (showData != null) {
try {
//Write code to display the controls in the layout xml
} catch (Exception ex) {
...
}
}
return convertView;
}
将 adapter
分配给 ListView
ShowDataAdapter adapter_Data = new ShowDataAdapter
(this,android.R.layout.simple_list_item_1, android.R.id.text1,list_AdapterItems);
listview.setAdapter(adapter_Data);
从 Android Activity 打开对话框
这可以通过两种方式实现:
- 通过
AlertDialog
- 通过
Dialog
类
通过 AlertDialog
- 声明
AlertDialog
对象 - 设置消息和标题
- 设置正面和负面按钮
- 显示对话框
AlertDialog alertDialog = new AlertDialog.Builder(Main.this).create();
alertDialog.setTitle("Error...");
alertDialog.setMessage("Unable to open. Continue?");
alertDialog.setPositiveButton(/*Create new onclickListener*/);
alertDialog.setNegativeButton(/*Create new onclickListener*/);
alertDialog.show();
通过 Dialog 类
步骤
- 为对话框布局创建 XML 资源。
- 从 Android 的
android.app.Dialog
类派生一个类。
在 XML 资源中,添加我们想在对话框中显示的所有控件。在这里,我们将添加一个 TextView 以及确定和取消按钮。
在 derive
类的构造函数中,通过调用 setContentView()
来设置 XML 资源。
setContentView(R.layout.popup);
修订历史
- 2013 年 6 月 9 日:首次发布