从数据库填充Listview仅适用一次

时间:2015-08-17 14:45:22

标签: android listview android-listview

我尝试将带有用户条目的listview更新为两个文本输入。单击保存按钮后,将显示用户的条目。根据我的代码,listview会在我第一次填写两个文本输入时更新并点击保存,但第二次点击保存时,listview不会更新。这是我的代码:

Home.java

public class Home extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

EditText inputOne;
EditText inputTwo;
MyDBHandler dbHandler; 
Button saveButton; 
MyCursorAdapter cursorAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    inputOne = (EditText) findViewById(R.id.inputOne);
    inputTwo = (EditText) findViewById(R.id.inputTwo);
    dbHandler = new MyDBHandler(this, null, null, 1);
    saveButton = (Button) findViewById(R.id.saveButton);

    MyDBHandler myDBHandler = new MyDBHandler(this);
    Cursor c = myDBHandler.getCursor();
    cursorAdapter = new MyCursorAdapter(this,c,1);
    ListView notes = (ListView) findViewById(R.id.notes);
    notes.setAdapter(cursorAdapter);


public void saveClicked(View view) {
    Test test = new Test( inputOne.getText().toString(), inputTwo.getText().toString() );
    dbHandler.addTest(test);
    inputOne.setText("");
    inputTwo.setText("");

    cursorAdapter.notifyDataSetChanged();

}

MyDBHandler.java

public class MyDBHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "Database.db";
public static final String TABLE_TEST = "test";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_ONE = "one";
public static final String COLUMN_TWO = "two";

public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_TEST + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            COLUMN_ONE + " TEXT," +
            COLUMN_TWO + " TEXT" + ");";
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TEST);
    onCreate(db);
}

public void addTest(Test test){
    ContentValues values = new ContentValues();
    values.put(COLUMN_ONE, test.get_one());
    values.put(COLUMN_TWO, test.get_two());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_TEST, null, values);
    db.close();
}

public Cursor getCursor(){
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_ACTIVITIES + " WHERE 1";

    Cursor c = db.rawQuery(query, null);

    return c;

}

}

MyCursorAdapter.java

public class MyCursorAdapter extends CursorAdapter {

public MyCursorAdapter(Context context, Cursor c, int flags) {
    super(context, c, 1);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context).inflate(R.layout.custom_row, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {

    TextView one = (TextView) view.findViewById(R.id.one);
    TextView two = (TextView) view.findViewById(R.id.two);

    String one_string = cursor.getString(cursor.getColumnIndexOrThrow(MyDBHandler.COLUMN_ONE));
    one.setText(one_string);

    String two_string  = cursor.getString(cursor.getColumnIndexOrThrow(MyDBHandler.COLUMN_TWO));
    two.setText(two_string);

}

}

Test.java

public class Test {

private int _id;
private String _one;
private String _two;

public Test(){

}

public Test(int id){
    this._id = id;
}

public Test(String one, String two){
    this._one = one;
    this._two = two;
}

public int get_id() {
    return _id;
}

public void set_id(int _id) {
    this._id = _id;
}

public String get_one() {
    return _one;
}

public void set_one(String _one) {
    this._one = _one;
}

public String get_two() {
    return _two;
}

public void set_two(String _two) {
    this._two = _two;
}

2 个答案:

答案 0 :(得分:0)

刷新Cursor支持的ListView的正确方法是调用cursorAdapter.notifyDatasetChanged(),而无需重新创建和重置适配器。

因此,在saveClicked方法中,您只需更新数据库,并让适配器知道已发生更改。

为此,您需要将对适配器的引用保留为实例字段,而不是将其声明为局部变量。

答案 1 :(得分:0)

原来我的ListView正在填充,但我错误地将一个ListView放在ScrollView中 - 所以我无法看到添加的条目。一旦我使用了这个解决方案,它就起作用了:Android - ListView's height just fits 1 ListView item