ここから本文です

AndroidプログラミングでListViewで質問です。 ListViewの1個のようそアダプタだ...

dhf********さん

2018/4/1310:10:50

AndroidプログラミングでListViewで質問です。
ListViewの1個のようそアダプタだけupdateするにはどうしたらよいでしょうか?

MainActivityクラスで、
ListView itemListView; //リストビュー
EditText noteEditText; //エディットテキスト
static Db dbAdapter; //Dbクラス
static NoteListAdapter listAdapter; //NoteListAdapter クラス
static List<Kihon> noteList = new ArrayList<Kihon>(); //メモ内容と更新日時を保持のKihonクラス

//アップデートボタン
protected void updateItem(){
dbAdapter.open();
dbAdapter.lodeNote(noteEditText.getText().toString(), int id);
dbAdapter.close();
//noteEditText.setText("");
loadNote();
}

返すDbクラスには
public void lodeNote(String upnote, int id){
Date dateNow = new Date();
ContentValues values = new ContentValues();
values.put(COL_NOTE, upnote);
values.put(COL_LASTUPDATE, dateNow.toLocaleString());
db.update(TABLE_NAME, values, String.valueOf(id), null);
}

リストビューに設定しているNoteListAdapter クラスには
private class NoteListAdapter extends BaseAdapter {
@Override
public int getCount() {
return noteList.size();
}

@Override
public Object getItem(int position) {
return noteList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
--------省略--------
Kihon note = (Kihon)getItem(position);
if(note != null){
kihonTextView = (TextView)v.findViewById(R.id.noteTextView);
lastupdateTextView = (TextView)v.findViewById(
R.id.lastupdateTextView);
noteTextView.setText(note.getNote());
lastupdateTextView.setText(note.getLastupdate());
v.setTag(R.id.noteTextView, note);
}
return v;
}
}

のようにしていますが、ListViewで仮に3個アダプタが表示されていたら、
アップデートボタンを押すと全部更新されてしまいます。
dbAdapter.lodeNote(String、 int)のintをDbに返して
Dbクラスのdb.update(TABLE_NAME, values, String.valueOf(id), null);
のとこのString.valueOf(id),のidに値を返せばできると思うのですが、
どのようにすればよいでしょうか?

長文すみませんが、よろしくお願いします。

補足rp0さん、ありがとうございます。

>アップデートボタンを押したとき、ListViewに何かしてますか?
ですが、たぶんなにも何もしてないです。
ボタン押してupdateItem()に返し、
updateItem(){
----省略-----
loadNote();
}
のloadNote();に返し、

protected void loadNote(){
noteList.clear();
dbAdapter.open();
Cursor c = dbAdapter.getAllNotes(); //SQLiteのdbAdapter

if(c.moveToFirst()){
do {
Kihon note = new Kihon (
c.getInt(c.getColumnIndex
(Db.COL_ID)), //id
c.getString(c.getColumnIndex(Db.COL_NOTE)), //Edittextの内容
c.getString(c.getColumnIndex(Db.COL_LASTUPDATE))
);//日時
noteList.add(note);
} while(c.moveToNext());
}
dbAdapter.close();
listAdapter.notifyDataSetChanged();//更新

のようにしてます。

onCreate内で
//NoteListAdapterクラス呼び出し
itemListView.setAdapter(listAdapter);

にしてます。
何か疑問がありましたら質問お願いします。

閲覧数:
36
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

とみおさん

2018/4/1409:41:34

記載のコードはデータの扱い方のようですが
ListViewの表示更新をするには、ListViewのインスタンスに対して、描画を促すメソッドを実行したときです

質問文から
アップデートボタンを押したとき、ListViewに何かしてます?
例えばsetAdapterとか

そこが重要なので
アップデートボタンのクリック処理の全文(OnClickリスナー)があると助かります

  • とみおさん

    2018/4/1515:26:07

    こいつで再描画を促してるんですね
    > listAdapter.notifyDataSetChanged();

    リスト全体を更新する手法にAdapterを作り直してListView#setAdapter()するコードよく見るので早とちりしました(^_^;)


    では、本題
    Adapter#notifyDataSetChanged()
    はリストの全体更新関数のため全体が更新されます
    部分更新はAPIにないのでListViewの描画原理を利用して実現させます

    それには、
    getView()の「--------省略--------」の部分
    convertViewの再利用ができている必要がありますがOKです?
    また
    idと、noteListの要素番号は一致しているってことでいいです?

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる