Используйте класс dbhelper в представлении адаптера, но у него есть контекст, который всегда показывает ноль, и мой метод для удаления заметки не работает? - PullRequest
0 голосов
/ 03 июля 2018

Это мой вспомогательный класс базы данных:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "note_db" ;

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(Note.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + Note.TABLE_NAME);

        onCreate(sqLiteDatabase);
    }

    public Long insertnote(String note){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Note.COL_NOTE,note);
        Long result = db.insert(Note.TABLE_NAME,null,values);
        db.close();

        return result;

    }

    public List<Note> getAllNotes() {
        List<Note> notes = new ArrayList<>();

        // Select All Query
        String selectQuery = "SELECT  * FROM " + Note.TABLE_NAME ;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Note note = new Note();
                note.setId(cursor.getInt(cursor.getColumnIndex(Note.COL_ID)));
                note.setNote(cursor.getString(cursor.getColumnIndex(Note.COL_NOTE)));

                notes.add(note);
            } while (cursor.moveToNext());
        }

        // close db connection
        db.close();

        // return notes list
        return notes;
    }

    public int updateNote(Note note) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Note.COL_NOTE, note.getNote());

        // updating row
        return db.update(Note.TABLE_NAME, values, Note.COL_ID + " = ?",
                new String[]{String.valueOf(note.getId())});
    }

    public void deleteNote(Note note) {
        SQLiteDatabase db = this.getWritableDatabase();
//        db.execSQL("DELETE FROM " + Note.TABLE_NAME + "WHERE " + Note.COL_ID +" = " + note.getId() +"" );

        db.delete(Note.TABLE_NAME, Note.COL_ID + " = ?",new String[]{String.valueOf(note.getId())});
        db.close();
    }
}

это моя основная деятельность

Я также сделал адаптер в основной деятельности в адаптере я использовал onlongclick слушатель. Я не очень осведомлен об этом. и когда я нажимаю на кнопку удаления диалогового окна оповещения, ничего не происходит. Помоги мне избавиться от этого.

public class MainActivity extends AppCompatActivity {

    RecyclerView rv;
    RecyclerAdapter adapter;
    FloatingActionButton btnadd;
    DatabaseHelper db;
    List<Note> notesList = new ArrayList<>();

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

        db = new DatabaseHelper(this);
        notesList.addAll(db.getAllNotes());

        rv = findViewById(R.id.rv);
        btnadd = findViewById(R.id.btnadd);

        adapter = new RecyclerAdapter(this, notesList);
        adapter.notifyDataSetChanged();
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
        rv.setLayoutManager(mLayoutManager);
        rv.setItemAnimator(new DefaultItemAnimator());
        rv.setAdapter(adapter);
        btnadd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                addnote();

            }
        });

    }

    public void addnote() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        View v = getLayoutInflater().inflate(R.layout.add_note,null);

        builder.setView(v);

        final AlertDialog dialog = builder.create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();

        final EditText addnote = v.findViewById(R.id.edtnote);
        final Button addbtn = v.findViewById(R.id.addbtn);
        final Button cancel = v.findViewById(R.id.cancel);


        addbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                if (addnote.getText().toString().isEmpty()==false){

                    db.insertnote(addnote.getText().toString());

                    dialog.dismiss();
                    Toast.makeText(getApplicationContext(),"Note Added",Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(getApplicationContext(),"please add note",Toast.LENGTH_SHORT).show();
                }

            }
        });

       cancel.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               dialog.cancel();
           }
       });


    }

    private void deleteNote(int position) {
        // deleting the note from db
        db.deleteNote(notesList.get(position));

        // removing the note from the list
        notesList.remove(position);
    }

}

это класс адаптера утилизатора он также помещен в основной вид деятельности

class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>{

    Context context;
    public List<Note> noteList;
//    DatabaseHelper db = new DatabaseHelper(context);

    public RecyclerAdapter(Context context,List<Note> noteList){
        this.context = context;
        this.noteList = noteList;
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView notes;

        public ViewHolder(final View itemView){
            super(itemView);

            notes = itemView.findViewById(R.id.note);

        }

    }


    @Override
    public ViewHolder onCreateViewHolder(final ViewGroup viewGroup, final int i) {

        final Context context = viewGroup.getContext();

        View view = LayoutInflater.from(context)
                .inflate(R.layout.show_note,viewGroup,false);

        final ViewHolder holder = new ViewHolder(view);

        final DatabaseHelper db  = new DatabaseHelper(context);

        holder.notes.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(final View view) {

                AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
                View v = LayoutInflater.from(view.getContext()).inflate(R.layout.update_delete_note, null);

                final Button update, delete;

                update = v.findViewById(R.id.update);
                delete = v.findViewById(R.id.delete);

                builder.setView(v);

                final AlertDialog dialog = builder.create();
                dialog.show();

                update.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                    }
                });

У меня проблема здесь. этот код ничего не делает а также я хочу обновить представление в реальном времени.

Пожалуйста, покажи мне, как это сделать.

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

                delete.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        Log.e(String.valueOf(context),noteList.get(i).toString());

                        Note note = noteList.get(i);
                        db.deleteNote(note);
                    }
                });

                return true;
            }
        });

        return new ViewHolder(view);

    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int i) {

        final Note note = noteList.get(i);
        holder.notes.setText(note.getNote());

    }

    @Override
    public int getItemCount() {
        return noteList.size();
    }

}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

попробуйте

final Button update, delete;
update = v.findViewById(R.id.update);
delete = v.findViewById(R.id.delete);
builder.setView(v);
final AlertDialog dialog = builder.create();

update.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.i("UPDATE BUTTON", "TESTING!!!");
        dialog.dismiss();
    }
});

delete.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        Log.i("DELETE BUTTON", "TESTING!!!");
        dialog.dismiss();
    }
});


// Move this to bottom.
dialog.show();

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

0 голосов
/ 03 июля 2018
delete.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        Log.e(String.valueOf(context),noteList.get(i).toString());

                        Note note = noteList.get(i);
                        db.deleteNote(note);
                        notifyDataSetChanged();
                    }
                });

Добавьте notifyDataSetChanged (), и он обновит адаптер, потому что, когда вы вызываете этот метод, он сообщает адаптеру, что данные были обновлены, и адаптер будет обновляться с обновленными данными. Также используйте это в примечании об обновлении таким же образом. Просто добавьте это, наконец, после того, как закончите необходимые операции.

Я отправляю ответ об обновлении с вашим кодом. Сначала добавьте этот метод в свой адаптер

 public void refreshData(Context context,List<Note> noteList){
        this.context = context;
        this.noteList = noteList;
         notifyDataSetChanged();
    }

Причина в том, что когда вы вставляете новый элемент в sqlite, вам нужно добавить этот элемент в свой список и отправить обновленный список адаптеру, а в адаптере необходимо вызвать notifyDataSetChanged (); и адаптер будет обновлен. Это рекомендуемый способ обновления адаптера.

следующий в вашей активности метод addNote () измените его на: -

public void addnote() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        View v = getLayoutInflater().inflate(R.layout.add_note,null);

        builder.setView(v);

        final AlertDialog dialog = builder.create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();

        final EditText addnote = v.findViewById(R.id.edtnote);
        final Button addbtn = v.findViewById(R.id.addbtn);
        final Button cancel = v.findViewById(R.id.cancel);


        addbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                if (!TextUtils.isEmpty(etInterestName.getText().toString().trim())){

                    db.insertnote(addnote.getText().toString().trim());
                    notesList.add(addnote.getText().toString().trim());
                    adapter.refreshData(this, notesList);
                    dialog.dismiss();
                    Toast.makeText(getApplicationContext(),"Note Added",Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(getApplicationContext(),"please add note",Toast.LENGTH_SHORT).show();
                }

            }
        });

       cancel.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               dialog.cancel();
           }
       });
    }

Сначала я изменил TextUtils.isEmpty(etInterestName.getText().toString().trim()) Так как это лучший способ убедиться, что текст редактирования не является пустым или пустым, и после того, как вы вставите свой элемент в sqlite, просто добавьте его в свой список

 notesList.add(addnote.getText().toString().trim()); 
     adapter.refreshData(this, notesList);

А затем вызовите метод refreshData в вашем адаптере, и данные будут обновлены. Надеюсь, что это решит вашу проблему, и если он пометит ответ как правильный !!.

...