2016-03-15 4 views
1

У меня есть listview, который захватывает информацию из базы данных SQLite и отображает ее. Есть EditText вместе с addButton. Когда нажимается addButton, текст в EditText помещается в базу данных, после чего предполагается, что listview обновляется. Добавление к базе данных работает, однако список не обновляется до тех пор, пока вы не приостановите действие и не возобновите его снова.Добавить/удалить SQLite Listview не обновляет

В этом макете также есть eraseButton, в котором все текстовые поля с выбранными флажками должны быть удалены из базы данных и удалены из списка. В этой задаче кнопка не удаляет выбранные текстовые поля (возможно, из-за некоторых проблем с rowid в базе данных.Я считаю, что она не будет обновлять listview после удаления либо как метод такой же для 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); 
      } 
     }); 


    } 


} 

Это DatabaseHandler

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

} 
+0

Вы уверены, что транзакция совершена при вводе в db? – km86

+0

Да, когда я закрываю приложение и открываю его снова, добавленная строка присутствует в списке. –

+1

Хм, повторите попытку, а затем скажем, адаптер.swap (newCursor) – km86

ответ

0

Вы могли бы попытаться добавить элемент в адаптер и затем вызвать адаптер. notifyDataSetChanged после него.

это выглядит любит это то

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

или поместить метод уведомления после swapCursor

+0

Спасибо, но проблема с обновлением уже решена. См. Комментарии выше. Осталось только отсортировать добавленные строки в базе данных, чтобы при удалении строки все строки внизу были перемещены вверх, чтобы заполнить пробел в пустой строке. Любые советы о том, как это сделать? –

+0

Вы хотите изменить таблицы базы данных после удаления или это просто проблема с отображением? –

0

Проблема решена путем добавления нового курсора после обновления базы данных. Спасибо пользователю3431672 за ответ.

adapter.swapCursor(newCursor); 
Смежные вопросы