[アンドロイド] P3の改善アプリケーション - Android用データベース

で 2 幸いなことに、我々が持っています データベースを作成します完全なインタフェースのデザイン アプリケーション. この時点で、我々は完璧なスポットに続けます

注意:
私は英語で記述します。このシリーズのスクリプト. しかし、それはあなたが簡単に従いますので、「ベトナムから翻訳 "私の英語のライティングスタイルがあります.
ここに: Androidのスタジオ 1.2.2
AndroidのSDK 5.1.1
ミンSDK: 4.0 (アンドロイド 4.0 上記のアプリを使用します)
しかし、あなたは絶対にEclipseと下Android上で行うことができます

ステップ 1: アイテムのアダプタの作成

我々はRecyclerViewHolderを通じてRecyclerViewのアイテムアダプタを作成します。, それは私たちのリストをスムーズにするのに役立ちます, 最適化されました.

ItemNoteAdapter.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package cachhoc.net.tut.demodatabase;
 
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
 
import java.util.ArrayList;
import java.util.List;
 
public class ItemNoteAdapter extends RecyclerView.Adapter<ItemNoteAdapter.RecyclerViewHolder> {
 
    // list of note
    private List<Note> list = new ArrayList<Note>();
    private Context context;
 
    public ItemNoteAdapter(Context context, List<Note> list) {
        this.context = context;
        this.list = list;
    }
 
    @Override
    public int getItemCount() {
        return list.size();
    }
 
    /**
     * connect to item view
     */
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.item, viewGroup, false);
        return new RecyclerViewHolder(itemView);
    }
 
    /**
     * set data for item
     */
    @Override
    public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) {
        Note note = list.get(position);
        viewHolder.tvTitle.setText(note.getTitle());
        viewHolder.tvContent.setText(note.getContent());
    }
 
 
    public void addItem(int position, Note note) {
        list.add(position, note);
        notifyItemInserted(position);
    }
 
    public void removeItem(int position) {
        list.remove(position);
        notifyItemRemoved(position);
    }
 
    /**
     * ViewHolder for item view of list
     */
 
    public class RecyclerViewHolder extends RecyclerView.ViewHolder implements
            OnClickListener {
 
        public LinearLayout container;
        public TextView tvTitle;
        public TextView tvContent;
 
        public RecyclerViewHolder(View itemView) {
            super(itemView);
 
            container = (LinearLayout) itemView.findViewById(R.id.item_container);
            tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
            tvContent = (TextView) itemView.findViewById(R.id.tv_content);
 
            container.setOnClickListener(this);
        }
 
        // click item then display note
        @Override
        public void onClick(View v) {
            MainActivity.showNote(context, list.get(getPosition()).getId());
        }
    }
}

私はノートshowNoteを表示するためのメソッドを呼び出す必要があり上方にクリックされたとき 1 アイテム. このメソッドは、クラスMainActivityで書かれています.

ステップ 2: 建設MainActivity

MainActivity.java
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
package cachhoc.net.tut.demodatabase;
 
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
 
import java.util.ArrayList;
import java.util.List;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private ItemNoteAdapter adapter;
    private List<Note> listNote = new ArrayList<>();
 
    private Context context;
 
    private DatabaseHelper db;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        context = this;
 
        db = new DatabaseHelper(context);
 
        connectView();
    }
 
    /**
     * connect java with xml view
     */
    private void connectView() {
 
        // find Float Action Button
        findViewById(R.id.fab).setOnClickListener(this);
 
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_note);
 
        // If the size of views will not change as the data changes.
        recyclerView.setHasFixedSize(true);
 
        // Setting the LayoutManager.
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
 
        // Setting the adapter.
        adapter = new ItemNoteAdapter(context, listNote);
        recyclerView.setAdapter(adapter);
    }
 
    /**
     * update list note when resume (open app or finish NoteActivity)
     */
    public void onResume() {
        super.onResume();
        updateListNote();
    }
 
    /**
     * select all note from database and set to ls
     * use for loop to add into listNote.
     * We must add all item in ls into listNote then adapter can update
     * we add reverse ls to show new note at top of list
     */
    private void updateListNote() {
        // clear old list
        listNote.clear();
        // add all notes from database, reverse list
        ArrayList<Note> ls = db.getListNote("SELECT * FROM " + DatabaseHelper.TABLE_NOTE);
 
        // reverse list
        for (int i = ls.size() - 1; i >= 0; i--) {
            listNote.add(ls.get(i));
        }
 
        adapter.notifyDataSetChanged();
    }
 
    /**
     * display note have id
     */
    public static void showNote(Context context, long id) {
        Intent intent = new Intent(context, NoteActivity.class);
 
        // send id to NoteActivity
        intent.putExtra(NoteActivity.ID, id);
 
        context.startActivity(intent);
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.fab:
                showNote(context, NoteActivity.NEW_NOTE);
                break;
            default:
                break;
        }
    }
}

コー​​ドは、理解することは非常に簡単です. のみ 2 あなたは以下の懸念を共有することができます:

  • それがレイアウトRecyclerView設定する必要が動作するようにできるようにするには. LinearLayoutManagerという名前の彼のコードでは一方RecyclerViewリストは、リストビューのように平滑化されます. あなたが使用する場合は、グリッドになりますGridLayoutManager.

  • チョンTA選択のArrayList LSに割り当てられたデータベースから. そして、むしろlistNoteにこれらの要素をコピーします 割り当てられていないlistNoteの=のLS その後listNoteは異なるメモリ領域を備えていますので、 (LSのメモリ) アダプタが更新できないことができ. 私はリストの先頭の後に書かれたメモを入れたいので、私たちはまたlistNoteに割り当てるには、lsを逆転します.

ステップ 3: ノート起草NoteActivityを作成

NoteActivity.java
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
package cachhoc.net.tut.demodatabase;
 
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
import android.support.v7.app.AlertDialog;
 
 
public class NoteActivity extends AppCompatActivity {
 
    /**
     * if action is add new note, it will init by NEW_NOTE
     */
    public static final long NEW_NOTE = -1;
 
    /**
     * key for get id note from other activity to display note
     */
    public static final String ID = "ID";
 
    /**
     * to edit, add,... note from database
     */
    private DatabaseHelper db;
 
    /**
     * note curren
     */
    private Note note;
 
    private EditText editTitle;
    private EditText editContent;
 
    private Context context;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_note);
 
        context = this;
 
        db = new DatabaseHelper(context);
 
        connectView();
        getInfo();
    }
 
    /**
     * conect with xml view
     */
    private void connectView() {
        editTitle = (EditText) findViewById(R.id.edit_title);
        editContent = (EditText) findViewById(R.id.edit_content);
    }
 
    /**
     * get info note to display
     */
    private void getInfo() {
        long id = getIntent().getLongExtra(ID, NEW_NOTE);
 
        // not new note then find note from database by id of note
        if (id != NEW_NOTE) {
            String sql = "SELECT * FROM " + DatabaseHelper.TABLE_NOTE + " WHERE " + DatabaseHelper.KEY_ID_NOTE + " = " + id;
            note = db.getNote(sql);
        }
         
        if (note != null) {
            editTitle.setText(note.getTitle());
            editContent.setText(note.getContent());
        } else {
            editTitle.setText("");
            editContent.setText("");
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_note, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_save:
                save();
                break;
            case R.id.menu_delete:
                delete();
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * get title and content of note, if they empty then finish
     * if they not empty then check note is null?
     * if note is null (create new note), we will create note and insert into database
     * if note not null then we update note
     * after save we finish activity
     */
    private void save() {
 
        String title = editTitle.getText().toString().trim();
        String content = editContent.getText().toString().trim();
 
        String notify = null;
 
        if (TextUtils.isEmpty(title) && TextUtils.isEmpty(content)) {
            notify = "note empty, don't save!";
        } else {
            // new note
            if (note == null) {
                Note note = new Note();
                note.setTitle(title).setContent(content);
                if (db.insertNote(note) > 0) {
                    notify = "add success!";
                } else {
                    notify = "add fail!";
                }
            } else { // update note
                note.setTitle(title).setContent(content);
                if (db.updateNote(note)) {
                    notify = "update success!";
                } else {
                    notify = "update fail!";
                }
            }
        }
 
        Toast.makeText(context, notify, Toast.LENGTH_SHORT).show();
        finish();
    }
 
    /**
     * get title and content of note, if they empty then finish
     * if they not empty then show dialog to show question delete
     * if select no delete then close dialog
     * if select delete then delete note
     */
    private void delete() {
        String title = editTitle.getText().toString().trim();
        String content = editContent.getText().toString().trim();
 
        if (TextUtils.isEmpty(title) && TextUtils.isEmpty(content)) {
            finish();
        } else {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
            builder.setTitle(R.string.delete).setIcon(R.mipmap.ic_launcher)
                    .setMessage("Do you want delete note?");
            builder.setPositiveButton(R.string.no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            builder.setNegativeButton(R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    deleteNote();
                }
            });
            builder.show();
        }
    }
 
    /**
     * check note is null?
     * if is null then finish
     * if note not null then delete in database and finish
     */
    private void deleteNote() {
        if (note != null) {
            String where = DatabaseHelper.KEY_ID_NOTE + " = " + note.getId();
            String notify = "delete success!";
 
            if (!db.deleteNote(where)) {
                notify = "delete failt!";
            }
            Toast.makeText(context, notify, Toast.LENGTH_SHORT).show();
        }
        finish();
    }
 
    /**
     * click back button on phone
     */
    @Override
    public void onBackPressed() {
        save();
    }
 
}

NoteActivityで, その意図IDに送信されますし始めたとき、. NEUのID = NEW_NOTE (た -1) それは新しいノートを作成することを意味します, 我々はeditTitleのためのsetTextと空の文字列をeditContent. それ以外の場合は、データベースからそのIDに注意してください取ると上に表示されます.

コー​​ドを完全に混乱. 私たちは、あなたがアプリケーションを完了することができます願っています.

あなたは、スポットすることができますされ ダウンロードプロジェクトDemoDatabase

一部 4 次に私が変更した場合、現在のアプリケーションエラーが発生することなく、データベースを更新する方法をご案内します.

チュートリアルで行われた投稿 データベースtrongのアンドロイド によって nguyenvanquan7826