添加/删除 SQLite 列表视图不更新



我有一个列表视图,它从SQLite数据库中获取信息并显示它。有一个EditText和一个addButton。当按下addButton时,EditText中的文本被放入数据库中,之后列表视图应该更新。添加到数据库是有效的,但是列表视图不会更新,直到您暂停活动并再次恢复它。

在此布局中,还有一个 eraseButton,所有带有选定复选框的文本视图都应从数据库中删除并从列表视图中删除。在此问题中,按钮不会删除选定的文本视图(可能是由于数据库中的某些 rowid 问题。我相信删除后它也不会更新列表视图,因为 addButton 的方法相同。

任何帮助,不胜感激。

这是主要活动

package net.ddns.introzen.jagharaldrig;
import android.app.ListFragment;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class Main3Activity extends AppCompatActivity {
    //ArrayList<String> questions = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        //SQLite Database
        final DatabaseHandler db = new DatabaseHandler(this);

        //listview
        //add items
        /*questions.add("Jag har aldrig");
        questions.add("Jag har aldrig varit");
        questions.add("Jag har aldrig2");
        //Checkboxadapters
        final ListView questionList = (ListView) findViewById(R.id.questionList);
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, questions);
        if(questionList != null) {
            questionList.setAdapter(adapter);
            questionList.setItemsCanFocus(false);
            questionList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        }*/
        final ListView questionList = (ListView) findViewById(R.id.questionList);
        final Cursor cursor = db.getData();
        final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, new String[] { DatabaseHandler.COL_QUESTION }, new int[] { R.id.checkedTextView1 },0);
        assert questionList != null;
        questionList.setAdapter(adapter);
        questionList.setItemsCanFocus(false);
        questionList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        //Erasebutton listener
        final Button eraseButton = (Button) findViewById(R.id.eraseButton);
        assert eraseButton != null;
        eraseButton.setOnClickListener(new View.OnClickListener() { //erasebutton onclick
            public void onClick(View eraseButton) {
                SparseBooleanArray checked = questionList.getCheckedItemPositions();
                for(int i = questionList.getCount() - 1; i >= 0; i--)
                {
                    if(checked.get(i)) {
                        //What to do with selected listitems
                        db.removeData(i);
                    }
                }
                checked.clear();
                Cursor newCursor = db.getData();
                adapter.swapCursor(newCursor);
            }
        });

        //addbutton listener
        final Button addButton = (Button) findViewById(R.id.addButton);
        assert addButton != null;
        addButton.setOnClickListener(new View.OnClickListener() { //Nextbutton onclick
            public void onClick(View addButton) {
                EditText addText = (EditText) findViewById(R.id.addText);
                assert addText != null;
                String text = addText.getText().toString();
                db.insertData(text);
                Cursor newCursor = db.getData();
                adapter.swapCursor(newCursor);
            }
        });

        //Nextbutton listener
        final Button returnButton = (Button) findViewById(R.id.returnButton);
        assert returnButton != null;
        returnButton.setOnClickListener(new View.OnClickListener() { //Nextbutton onclick
            public void onClick(View returnButton) {
                Intent mainMenu = new Intent(Main3Activity.this, Main2Activity.class);
                Main3Activity.this.startActivity(mainMenu);
            }
        });

    }

}  

这是数据库处理程序

package net.ddns.introzen.jagharaldrig;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "questions.db";
    public static final String TABLE_NAME = "questions";
    public static final String COL_ID = "ID";
    public static final String COL_QUESTION = "question";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " ( " + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_QUESTION + " TEXT);");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
        onCreate(db);
    }

    public boolean insertData(String question) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(COL_QUESTION, question);
        db.insert(TABLE_NAME, null, cv);
        return true;
    }
    public boolean removeData(int position) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, COL_ID+"="+position, null);
        return true;
    }
    public Cursor getData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("SELECT "+COL_ID+" AS _id, "+COL_QUESTION+" FROM " + TABLE_NAME, null);
        return res;
    }
}

您能否尝试将项目添加到适配器,然后调用适配器。 通知数据集更改后。

然后看起来像这样

db.insertData(text)
adapter.add()//the item;
adapter.notifyDataSetChanged();

或将通知方法放在交换光标之后

通过在更新数据库后添加新游标解决了问题。谢谢用户3431672的回答。

adapter.swapCursor(newCursor);

最新更新