Удалить элемент нажатием кнопки

В моем MainActivity я хочу, чтобы моя кнопка удаляла все элементы в моем списке просмотра. К сожалению, все найденные здесь решения мне не помогут. Если я нажимаю кнопку «Очистить все», он удаляет все элементы в моем списке, но элементы все еще сохраняются в моей базе данных.

Я новичок в Android Studio, поэтому не знаю, как написать код, чтобы он работал так, как я хочу.

Это моя MainActivity:

package com.vorlesung.iubh.todo;

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.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    DatabaseHepler myDB;
    ArrayList<String> list;
    ListView myToDoList;
    ArrayAdapter<String> arrayAdapter;
    SparseBooleanArray selectedItem;

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

        Button addToDo = (Button) findViewById(R.id.addToDo);
        Button clearAll = (Button) findViewById(R.id.clearALL);
        Button editSelected = (Button) findViewById(R.id.editSelected);
        Button clearDone = (Button) findViewById(R.id.clearDone);

        myToDoList = (ListView) findViewById(R.id.myToDoList);
        myDB = new DatabaseHepler(this);

        list = new ArrayList<>();
        Cursor data = myDB.getListContents();

        if (data.getCount() == 0)
            Toast.makeText(this, "The Database was empty",         Toast.LENGTH_LONG).show();
        else {
            while (data.moveToNext()) {
                list.add(data.getString(1));
                arrayAdapter = new ArrayAdapter<>(this,     android.R.layout.simple_list_item_multiple_choice, list);
                myToDoList.setAdapter(arrayAdapter);
            }
        }
    }

    public void onClickaddToDo(View button) {
        Intent newToDo = new Intent(this, AddToDo.class);
        startActivity(newToDo);
    }

    // With this onClick I want to delete all Items from my List.
    public void onClickaclearALL(View button) {
        list.clear();
        arrayAdapter.notifyDataSetChanged();
    }
}

А это моя база данных:

package com.vorlesung.iubh.todo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHepler extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "myList.db";
    public static final String TABLE_NAME = "myList_Data";
    public static final String COL1 = "ID";
    public static final String COL2 = "ITEM1";

    public DatabaseHepler(Context context){super(context, DATABASE_NAME, null, 1);}

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "ITEM1 TEXT)";
        db.execSQL(createTable);
    }

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

    public boolean addData(String item1) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, item1);

        long result = db.insert(TABLE_NAME, null, contentValues);

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    public Cursor getListContents() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
        return data;
    }

    public void deleteRow() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+ COL2, null);
        db.close();
    }

}

Редактировать

В моем файле журнала показаны ошибки:

2018-12-23 10:16:05.627 21957-21973/com.vorlesung.iubh.todo E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
2018-12-23 10:16:05.627 21957-21973/com.vorlesung.iubh.todo E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
2018-12-23 10:16:05.628 21957-21973/com.vorlesung.iubh.todo E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
2018-12-23 10:17:26.766 21957-21957/com.vorlesung.iubh.todo E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.vorlesung.iubh.todo, PID: 21957
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:5610)
    at android.view.View$PerformClick.run(View.java:22265)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:5610) 
    at android.view.View$PerformClick.run(View.java:22265) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
 Caused by: java.lang.IllegalArgumentException: Empty bindArgs
    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1656)
    at com.vorlesung.iubh.todo.DatabaseHepler.deleteAllRow(DatabaseHepler.java:51)
    at com.vorlesung.iubh.todo.MainActivity.onClickaclearALL(MainActivity.java:59)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
    at android.view.View.performClick(View.java:5610) 
    at android.view.View$PerformClick.run(View.java:22265) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

вы только очистили список, но никогда не вызывали deleteRow ....

Jacob 23.12.2018 09:35

@Jacob: да, я знаю это, но я не знаю, где мне это называть или как :( Должен ли я вызывать это в моей MainActivity или в моей базе данных?

diem_L 23.12.2018 09:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Вы должны сначала удалить из базы данных, а затем обновить список.
  2. Не выполняйте действия с базой данных в основном потоке и используйте AsyncTask.

В вашем коде у вас должно быть две AsyncTasks: одна для получения этого списка, а другая для очистки списка.

Например, вы можете иметь это в своем MainActivity

private class DeleteItemsAsyncTask extends AsyncTask<Void, Void, Void> {
        private Context mContext;

        DeleteItemsAsyncTask(Context context) {
            mContext = context;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            myDB.deleteRow();
            return null;
        }

        @Override
        protected void onPostExecute(Void void) {
            list.clear();
            arrayAdapter.notifyDataSetChanged();
        }
    }

Тогда вы должны быть

// With this onClick I want to delete all Items from my List.
public void onClickaclearALL(View button) {
    new DeleteItemsAsyncTask(this).execute();
}

Точно так же вы должны сделать то же самое для перечисления данных.

Ответ принят как подходящий

Вам нужно создать функцию в База данныхHepler, чтобы удалить все элементы из таблицы.

В классе DatabaseHepler нужно написать эту функцию.

public void deleteAllRow() {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("delete from "+ TABLE_NAME);
    db.close();
}

В своей основной деятельности нужно написать такой код:

// With this onClick I want to delete all Items from my List.
public void onClickaclearALL(View button) {
    list.clear();
    myDB.deleteAllRow(); // this will delete all data from the table.
    arrayAdapter.notifyDataSetChanged();
}

Это вам поможет.

теперь приложение останавливается, если я нажимаю кнопку «Очистить все»

diem_L 23.12.2018 10:03

2018-12-23 10: 12: 56.234 21718-21718 / com.vorlesung.iubh.todo E / Android Время выполнения: НЕОБХОДИМОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.vorlesung.iubh.todo, PID: 21718 java.lang.IllegalStateException: Не удалось выполнить метод для Android: onClick

diem_L 23.12.2018 10:13

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

diem_L 23.12.2018 10:13

обновите функцию deleteAllRow () в своем коде, как указано выше.

Sandip 23.12.2018 10:24

спасибо спасибо спасибо .. теперь у меня все работает нормально. Большое спасибо и счастливого Рождества: D

diem_L 23.12.2018 10:27

Другие вопросы по теме

Похожие вопросы

Как исправить "Активность по умолчанию не найдена", когда я установил активность в файле манифеста Android?
Диалоговое окно авторизации эмулятора Android появляется каждый раз "разрешать всегда с этого компьютера"
Почему первое действие не переходит в другое, эмулятор показывает: «К сожалению, приложение остановлено, но мой Logcat не показывает ошибок»?
Как мы можем использовать основы разработчика Android V2 (концепции и кодовые таблицы) без подключения к Интернету (в автономном режиме)?
Новое действие не отображается (Android Studio)
Удалить сервис Google Play на эмуляторе
Добавление зависимости firebase-ads приводит к сбою моего приложения
У меня есть приложение для Android Spin, в котором я столкнулся с проблемой вывода средств
Как получить строковые данные из действия настроек и отправить их другому действию?
ListIterator - одна кнопка для следующего, одна для предыдущего, но для перемещения по списку требуется 2 щелчка мышки