65.9K
CodeProject 正在变化。 阅读更多。
Home

Android - 待办事项\购物清单

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2013年6月9日

CPOL

4分钟阅读

viewsIcon

37918

本技巧介绍了如何使用 ListView、SQLite、对话框和自定义适配器创建一个待办事项或购物清单应用。

引言

本技巧展示了如何创建一个购物清单/待办事项列表应用程序。它提供了以下方面的思路:

  1. 在 Activity 中添加列表项
  2. 从 Android Activity 打开对话框
  3. 使用 SQLite
  4. 如何将数据从一个 Activity 返回到另一个 Activity

to do list

在本技巧中,我们将讨论前两点。

开始

本技巧假定您已了解如何创建 Android 项目。请使用以下详细信息创建一个新的 Android 项目:

  • 应用名称 = UtilityPlus 项目名称 = UtilityPlus 包名 = com.utility.utilityplus
  • 最低必需 SDK 和目标 SDK = API 11 Android 3.0 (HoneyComb),然后点击完成。

活动和资源

此应用程序包含以下主要组件:

  1. MainActivity - 显示现有的购物清单/待办事项列表
  2. Dialog - 一个弹出窗口,用于向用户询问列表名称
  3. 添加新数据 Activity - 用户在此处输入列表内容。
  4. Adapter - 用于在 MainActivity 中显示数据
  5. DatabaseHelper - 用于连接和与 MainApplication 进行通信

Using the Code

在 Activity 中添加列表项

在继续之前,我们需要理解几个正在使用的基本概念:

  • ListView - 显示可滚动且逻辑相关的项列表。它是重要的 UI 组件,在许多应用程序中用于各种目的。
  • ListView Item - 在单行中显示的项/数据。它可以是纯文本(例如,显示联系人姓名),也可以更复杂,包含 2 个用于姓名和号码的 EditText,以及用于编辑和删除的 2 个按钮。
  • 数据源 - 数据源的网络定义为:“获取数据的来源,如人员、文档、产品、活动、事件和记录。” [参考:http://www.evaluationtoolkit.org/glossary]
    在编码方面,它可以是 ArrayList、任何数据类型(基本类型或复杂类型)的数组。
  • Adapter - 一段代码,它从数据源获取数据,并使其与 ListView 兼容。
    实际上,ListView 与其适配器之间的关系要复杂得多。

在 ListView 中显示纯文本作为列表项

  1. 在资源布局 XML 中添加 ListView
  2. 创建/查找数据源
  3. 为数据源创建一个 Adapter
  4. 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,然后使用 setAdapteradapter 设置到 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 中将一组控件显示为列表项

步骤
  1. 在资源布局 XML 中添加 ListView
  2. 创建/查找数据源
  3. ListView 的行模板中创建一个 XML 布局资源
  4. 为数据源创建一个 Adapter
  5. 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

  1. 声明 AlertDialog 对象
  2. 设置消息和标题
  3. 设置正面和负面按钮
  4. 显示对话框
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 类

步骤
  1. 为对话框布局创建 XML 资源。
  2. 从 Android 的 android.app.Dialog 类派生一个类。

在 XML 资源中,添加我们想在对话框中显示的所有控件。在这里,我们将添加一个 TextView 以及确定和取消按钮。
derive 类的构造函数中,通过调用 setContentView() 来设置 XML 资源。

setContentView(R.layout.popup);

修订历史

  • 2013 年 6 月 9 日:首次发布
© . All rights reserved.