如何寫一個記事本-新增修改刪除

如何寫一個記事本-新增修改刪除

情境

來寫一個簡單的記事本
可以新增刪除以及編輯

在看這篇文章之前,你可能需要了解一下以下的內容
如何使用ListView
如何使用Menu
如何使用AlertDialog
如何動態增減自訂ListView
這樣可能會比較容易理解本篇文章

完整程式碼

在一開始我們會先把完整程式碼呈現出來
只需要開啟新專案以後
複製貼上到相對應的位置就可以看到執行結果
MainActivty.java部分

public class MainActivity extends AppCompatActivity {
    private EditText inputText;
    private ListView listInput;
    private ArrayAdapter<String> adapter;
    private ArrayList<String> items;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inputText = (EditText)findViewById(R.id.inputText);
        listInput = (ListView)findViewById(R.id.listInputText);
        items = new ArrayList<>();
        adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,items);
        listInput.setAdapter(adapter);
        listInput.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long id) {
                final int pos = position;
                new AlertDialog.Builder(MainActivity.this)
                    .setTitle("刪除列")
                    .setMessage("你確定要刪除?")
                    .setPositiveButton("是", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            items.remove(pos);
                            listInput.setAdapter(adapter);
                        }
                    })
                    .setNegativeButton("否", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .show();

                return false;
            }

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, "新增");
        menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "離開程式");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case Menu.FIRST:
                if(!inputText.getText().toString().equals("")){
                    items.add(inputText.getText().toString());
                    listInput.setAdapter(adapter);
                    inputText.setText("");
                }
                break;
            case Menu.FIRST + 1:
                new AlertDialog.Builder(MainActivity.this)
                    .setTitle("離開此程式")
                    .setMessage("你確定要離開?")
                    .setPositiveButton("是", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setNegativeButton("否", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    })
                    .show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

activity_main.xml部分

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <EditText
        android:hint="請輸入文字..."
        android:layout_alignParentLeft="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputText"
        android:singleLine="true" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listInputText" />
</LinearLayout>

程式碼說明

首先我們定義EditText以及ListView
當我們在EditText裡面輸入文字,
接著按下Menu選擇新增, 就會把文字加入ListView。

首先定一個xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <EditText
        android:hint="請輸入文字..."
        android:layout_alignParentLeft="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputText"
        android:singleLine="true" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listInputText" />
</LinearLayout>

EditText裡面有一個屬性值singleLine設為true,
是防止使用者按下enter則EditText就會跳到下一行。

然後在onCreate裡面初始化每一個元件

private EditText inputText;
private ListView listInput;
private ArrayAdapter<String> adapter;
private ArrayList<String> items;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    inputText = (EditText)findViewById(R.id.inputText);
    listInput = (ListView)findViewById(R.id.listInputText);
    items = new ArrayList<String>();
    adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,items);
    listInput.setAdapter(adapter);                                                            }                                                                                    

其中ArrayList主要是因為想要動態新增ListView的item,
因此我們不用Array。

接著我們把Menu事件加入,
當按下menu的時候, 會跳出新增跟離開程式的選項。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, "新增");
    menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "離開程式");
    return super.onCreateOptionsMenu(menu);
}

然後加入當按下menu選項後處理的事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case Menu.FIRST:
            if(!inputText.getText().toString().equals("")){
                items.add(inputText.getText().toString());
                listInput.setAdapter(adapter);
                inputText.setText("");
            }
            break;
        case Menu.FIRST + 1:
            new AlertDialog.Builder(MainActivity.this)
                .setTitle("離開此程式")
                .setMessage("你確定要離開?")
                .setPositiveButton("是", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                })
                .setNegativeButton("否", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .show();
            break;
    }
    return super.onOptionsItemSelected(item);
}

第一個選項是本支程式最重要的部份,
當新增一個item的時候, 如何讓ListView能夠即時更新,
最主要的是將adapter重新載入。

第二個選項跳出一個AlertDialog再跟使用者確定一次是否真的要離開程式。

那如果想要刪除某一個item怎麼辦, 所以我們再加上一個事件,
當使用者長按著某一個item時,我們就跳出AlertDialog,
詢問是否要刪除這個item。

listInput.setOnItemLongClickListener(new OnItemLongClickListener(){
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long id) {
        final int pos = position;
        new AlertDialog.Builder(ListViewDBDemoActivity.this)
            .setTitle("刪除列")
            .setMessage("你確定要刪除?")
            .setPositiveButton("是", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    items.remove(pos);
                    listInput.setAdapter(adapter);
                }
            })
            .setNegativeButton("否", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .show();

            return false;
    }

});


這樣一來就完成一個簡單版的記事本了