简单的待办事项列表示例在Android上不起作用

时间:2011-07-09 13:28:33

标签: android list

我对Android很新,我一直在阅读Wrox Press的 Professional Android 2应用程序开发一书。最初的教程之一是一个简单的待办事项列表,它只是一个接一个地添加项目(它不保存信息或类似的东西,稍后会讲授)。我遇到的问题是它不仅打印我写的东西,它还添加了一个空项目,这样(对不起,我没有超过10个声誉,所以我无法发布图像。希望你得到的想法):


(空步)


第二项任务


(空白区域)


第一项任务


本书中编写的代码与网页here上显示的代码相同,并且勘误表部分中没有确认错误:

package com.paad.todoList;

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class Todo_ListActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Get references to UI widgets
    ListView myListView = (ListView) findViewById(R.id.myListView);
    final EditText myEditText = (EditText)findViewById(R.id.myEditText);

    //Creates the array list of to do items
    final ArrayList <String> todoItems = new ArrayList <String>();

    //Create the array adapter to bind the array to the listview
    final ArrayAdapter <String> aa;
    aa = new ArrayAdapter <String> (this, android.R.layout.simple_list_item_1, todoItems);

    //Bind the array adapter to the listview
    myListView.setAdapter(aa);

    myEditText.setOnKeyListener (new OnKeyListener(){
        public boolean onKey (View v, int keyCode, KeyEvent event){
            if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
                todoItems.add(0, myEditText.getText().toString());
                aa.notifyDataSetChanged();
                myEditText.setText("");
                return true;
            }
            else return false;
        }
    });
    }
}

我的main.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <EditText
        android:id="@+id/myEditText"
        android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        android:text="New To Do Item"
    />
<ListView
    android:id="@+id/myListView"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    />
</LinearLayout>

我知道这个错误来自这一行:

myEditText.setText("");

如果我注释掉那一行,那么程序会添加我写的两次:

   Second Task

   Second Task

   First Task

   First Task

如果我在引号内添加内容......

myEditText.setText("Error");

然后打印出来:

Error

Second task

Error

First Task

我查了Android API,但找不到解决方案。有人可以帮我吗?我怎么能用那些有用的东西代替呢?

2 个答案:

答案 0 :(得分:2)

每按一次键就会调出2个事件:KEY_DOWN,然后是KEY_UP事件。在你的代码中,你不会过滤那些,所以它只是为2激发。第一个在editText中有文本,而第二个在editText的文本被刷新后被触发。

您可以在onKey方法中添加以下内容:

if (event.getAction()!=KeyEvent.ACTION_DOWN)
     return true;

这将知道按键事件,但你不会对它做任何事情。然后,当密钥到来时,你将使用那个。

答案 1 :(得分:1)

实际上KEYCODE_DPAD_CENTER是方向性Pad中心键。也可以通过轨迹球运动合成。你需要提出这个代码,但它并不顺利。

OnKeyListener listener = new OnKeyListener(){
        public boolean onKey (View v, int keyCode, KeyEvent event){
            if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER && event.getAction()!=KeyEvent.ACTION_DOWN){
                todoItems.add(0, myEditText.getText().toString());
                myEditText.findFocus();
                myEditText.setText("");
                aa.notifyDataSetChanged();
                return true;
            }
            else return false;
        }
    };