Почему мой listView не показывает вставленные строки? - PullRequest
0 голосов
/ 16 марта 2012

У меня есть свой курсор курсора, который, безусловно, чего-то не хватает, потому что когда я добавляю элемент в базу данных, он не отображается в listView, но если я перезапускаю приложение, он показывает добавленные строки.

Вот мои действия и мой специальный адаптер:

package com.android.adapter;

import com.android.activity.R;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class NotesCursorAdapter extends CursorAdapter{

    private Context context;
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_ADD_NOTE_BOTTOM = 1;
    private static final int TYPE_ADD_NOTE_TOP = 2;
    private static final int TYPE_MAX_COUNT = TYPE_ADD_NOTE_TOP + 1;

    public NotesCursorAdapter (Context context, Cursor cursor, boolean flag){
        super(context, cursor, flag);
        this.context = context;
    }



    @Override
    public void bindView(View v, Context con, Cursor cursor) {
        TextView content = (TextView)v.findViewById(R.id.note);
        content.setText(cursor.getString(cursor.getColumnIndex("content_note")));
    }

    @Override
    public View newView(Context con, Cursor cursor, ViewGroup vp) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.row_note, vp, false);
        bindView(v, context, cursor);
        return v;

    }

}


package com.android.activity;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.android.adapter.NotesCursorAdapter;
import com.android.database.NoteDataSource;

public class EverydayNotesAndroid3Activity extends Activity {
    /** Called when the activity is first created. */

    private Cursor cursorNotes;
    private NoteDataSource dataNoteConnector;
    private NotesCursorAdapter notesCursorAdapter;
    private Activity activity;
    private ListView listView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        activity = this;

        dataNoteConnector = new NoteDataSource(activity);

        dataNoteConnector.open();

        cursorNotes = dataNoteConnector.getAllNotes();

        startManagingCursor(cursorNotes);

        listView = (ListView) findViewById(R.id.main_list);

        notesCursorAdapter = new NotesCursorAdapter(activity, cursorNotes, true);

        listView.setAdapter(notesCursorAdapter);

        Button b = new Button(activity);

        b = (Button) findViewById(R.id.done);

        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                cursorNotes = dataNoteConnector.createNoteTop("American Alex is god");
                cursorNotes.requery();
                System.out.println("and everyone should listen to him");


//              notesCursorAdapter.changeCursor(cursorNotes); // automatically closes old Cursor
//              notesCursorAdapter.notifyDataSetChanged();
            }
        });

}

Спасибо за внимание.

РЕДАКТИРОВАТЬ: Я нашел решение, но я ненавижу его, я хотел бы найти другое решение.

Сейчас я в своей деятельности:

cursorNotes = dataNoteConnector.createNoteTop("American Alex is god");

                cursorNotes = dataNoteConnector.getAllNotes();

                notesCursorAdapter = new NotesCursorAdapter(activity, cursorNotes, true);

                listView.setAdapter(notesCursorAdapter);

Я нахожу это безумным, должен быть более простой способ обновить список после обновления. Здесь я воссоздаю курсор, воссоздаю адаптер курсора, который я подаю с новым курсором, и затем воздействую на этот адаптер курсора на listView. Это как пример блокнота из android doc, но я уверен, что есть способ обновить адаптер и listView, просто манипулируя курсором, но я не достаточно умен, чтобы понять это.

Ответы [ 3 ]

1 голос
/ 16 марта 2012

попробуйте не комментировать последнюю строку в вашей активности

adapter.notifydatasetcanged();
0 голосов
/ 16 марта 2012

Это то, что Google должен сказать по поводу запроса ()

Этот метод устарел. Не используйте это. Просто запросите новый курсор, так что вы можете сделать это асинхронно и обновить свой список, как только новый курсор возвращается.

Вы можете проверить это здесь. http://developer.android.com/reference/android/database/Cursor.html

Так что они на самом деле предлагают вам делать то, что вы сделали. :) Но если вы все еще хотите сделать это другим способом, раскомментируйте notesCursorAdapter.notifyDataSetChanged (). В идеале Requery () должен вызывать noifydatasetchange (), но я заметил, что для обновления списка требуется явный вызов.

0 голосов
/ 16 марта 2012

ну, я не буду рекомендовать решение @Aashish. Лучше всего было бы создать список переменных и членов-членов адаптера, а затем пересоздать адаптер

private ListView listView;
private ListAdapter notesCursorAdapter;
private Cursor cursorNotes;

private void update() {
notesCursorAdapter = new NotesCursorAdapter(activity, cursorNotes, true); 
listView.setAdapter(notesCursorAdapter);
}
...