【问题标题】:Add/Remove SQLite Listview doesn't update添加/删除 SQLite 列表视图不更新
【发布时间】:2016-07-01 13:21:25
【问题描述】:

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

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

感谢任何帮助。

这是 MainActivity

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;
    }

}

【问题讨论】:

  • 你确定你的事务在你插入数据库的时候已经提交了吗?
  • 是的,当我关闭应用程序并再次打开它时,添加的行出现在列表视图中。
  • 嗯,再查询一次,然后说adapter.swap(newCursor)
  • 更新了原始帖子中的 MainActivity。添加到列表以及更新列表现在可以正常工作。从列表中删除有效,但是只有当我向列表视图添加明确数量的行时。我认为以前删除的行在数据库中可能存在错误。如何在删除行时填补数据库中的空白?

标签: android sqlite listview


【解决方案1】:

您能否尝试将项目添加到适配器,然后调用适配器。 notifyDataSetChanged 之后。

原来是这样的

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

或者将 notify 方法放在 swapCursor 之后

【讨论】:

  • 谢谢,但是更新问题已经解决了。见上面的 cmets。现在剩下的就是如何对数据库中添加的行进行排序,这样当我删除一行时,下面的所有行都将向上移动以填充空行的空间。关于如何做到这一点的任何提示?
  • 你的意思是删除后要修改数据库表还是只是显示问题?
【解决方案2】:

更新数据库后添加新游标解决了问题。感谢 user3431672 的回答。

adapter.swapCursor(newCursor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多