I have a list of items in my Recyclerview. At first, the checkbox is not visible.When I longclick on any item, checkbox appears on each item and it can be checked . But how to provide SELECT ALL option and check all the checkboxes by a single click?
Here is my Adapter class
package adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.mynotes.R;
import java.util.ArrayList;
import java.util.List;
import callbacks.NoteEventListener;
import model.Note;
import utils.NoteUtils;
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NoteHolder> {
private Context context;
private ArrayList<Note> notes;
private NoteEventListener listener;
private boolean multiCheckMode = false;
public NotesAdapter(Context context, ArrayList<Note> notes) {
this.context = context;
this.notes = notes;
}
@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.note_layout, parent, false);
return new NoteHolder(v);
}
@Override
public void onBindViewHolder(NoteHolder holder, int position) {
final Note note = getNote(position);
if (note != null) {
holder.noteText.setText(note.getNoteText());
holder.noteDate.setText(NoteUtils.dateFromLong(note.getNoteDate()));
// init note click event
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onNoteClick(note);
}
});
// init note long click
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onNoteLongClick(note);
return false;
}
});
// check checkBox if note selected
if (multiCheckMode) {
holder.checkBox.setVisibility(View.VISIBLE); // show checkBox if multiMode on
holder.checkBox.setChecked(note.isChecked());
} else holder.checkBox.setVisibility(View.GONE); // hide checkBox if multiMode off
}
}
@Override
public int getItemCount() {
return notes.size();
}
private Note getNote(int position) {
return notes.get(position);
}
/**
* get All checked notes
*
* @return Array
*/
public List<Note> getCheckedNotes() {
List<Note> checkedNotes = new ArrayList<>();
for (Note n : this.notes) {
if (n.isChecked())
checkedNotes.add(n);
}
return checkedNotes;
}
class NoteHolder extends RecyclerView.ViewHolder {
TextView noteText, noteDate;
CheckBox checkBox;
public NoteHolder(View itemView) {
super(itemView);
noteDate = itemView.findViewById(R.id.note_date);
noteText = itemView.findViewById(R.id.note_text);
checkBox = itemView.findViewById(R.id.checkBox);
}
}
public void setListener(NoteEventListener listener) {
this.listener = listener;
}
public void setMultiCheckMode(boolean multiCheckMode) {
this.multiCheckMode = multiCheckMode;
if (!multiCheckMode)
for (Note note : this.notes) {
note.setChecked(false);
}
notifyDataSetChanged();
}
}
MainActivity
package com.example.mynotes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.view.ActionMode;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import adapters.NotesAdapter;
import callbacks.MainActionModeCallback;
import callbacks.NoteEventListener;
import db.NotesDB;
import db.NotesDao;
import model.Note;
import static com.example.mynotes.EditNoteActivity.NOTE_EXTRA_Key;
public class MainActivity extends AppCompatActivity implements NoteEventListener {
private static final String TAG = "MainActivity";
private RecyclerView recyclerView;
private ArrayList<Note> notes;
private NotesAdapter adapter;
private NotesDao dao;
private MainActionModeCallback actionModeCallback;
private int chackedCount = 0;
private FloatingActionButton fab;
private SharedPreferences settings;
public static final String THEME_Key = "app_theme";
public static final String APP_PREFERENCES="notepad_settings";
private int theme;
@Override
protected void onCreate(Bundle savedInstanceState) {
settings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
theme = settings.getInt(THEME_Key, R.style.AppTheme);
setTheme(theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
settings = this.getSharedPreferences("My Data", MODE_PRIVATE);
// init recyclerView
recyclerView = findViewById(R.id.notes_list);
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// add new note
onAddNewNote();
}
});
dao = NotesDB.getInstance(this).notesDao();
}
private void loadNotes() {
this.notes = new ArrayList<>();
List<Note> list = dao.getNotes();// get All notes from DataBase
this.notes.addAll(list);
String mSortSettings = settings.getString("Sort", "ascending");
if (mSortSettings.equals("ascending")) {
Collections.sort(notes, Note.BY_TITLE_ASCENDING);
}
else if (mSortSettings.equals("descending")) {
Collections.sort(notes, Note.BY_TITLE_DESCENDING);
}
recyclerView.setLayoutManager(new LinearLayoutManager(this));
this.adapter = new NotesAdapter(this, this.notes);
// set listener to adapter
this.adapter.setListener(this);
this.recyclerView.setAdapter(adapter);
showEmptyView();
// add swipe helper to recyclerView
swipeToDeleteHelper.attachToRecyclerView(recyclerView);
}
/**
* when no notes show msg in main_layout
*/
private void showEmptyView() {
if (notes.size() == 0) {
this.recyclerView.setVisibility(View.GONE);
findViewById(R.id.empty_notes_view).setVisibility(View.VISIBLE);
} else {
this.recyclerView.setVisibility(View.VISIBLE);
findViewById(R.id.empty_notes_view).setVisibility(View.GONE);
}
}
/**
* Start EditNoteActivity.class for Create New Note
*/
private void onAddNewNote() {
startActivity(new Intent(this, EditNoteActivity.class));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_sort) {
showSortDialog();
return true;
}
return super.onOptionsItemSelected(item);
}
private void showSortDialog () {
String[] options = {"Ascending", "Descending"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Sort by");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
SharedPreferences.Editor editor = settings.edit();
editor.putString("Sort", "ascending");
editor.apply();
loadNotes();
}
else if (which == 1) {
SharedPreferences.Editor editor = settings.edit();
editor.putString("Sort", "descending");
editor.apply();
loadNotes();
}
}
});
builder.show();
}
@Override
protected void onResume() {
super.onResume();
loadNotes();
}
@Override
public void onNoteClick(Note note) {
// note clicked : edit note
Intent edit = new Intent(this, EditNoteActivity.class);
edit.putExtra(NOTE_EXTRA_Key, note.getId());
startActivity(edit);
}
@Override
public void onNoteLongClick(Note note) {
// note long clicked : delete
note.setChecked(true);
chackedCount = 1;
adapter.setMultiCheckMode(true);
// set new listener to adapter intend off MainActivity listener that we have implement
adapter.setListener(new NoteEventListener() {
@Override
public void onNoteClick(Note note) {
note.setChecked(!note.isChecked()); // inverse selected
if (note.isChecked())
chackedCount++;
else chackedCount--;
if (chackedCount == 0) {
// finish multi select mode wen checked count =0
actionModeCallback.getAction().finish();
}
actionModeCallback.setCount(chackedCount + "/" + notes.size());
adapter.notifyDataSetChanged();
}
@Override
public void onNoteLongClick(Note note) {
}
});
actionModeCallback = new MainActionModeCallback() {
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
if (menuItem.getItemId() == R.id.action_delete_notes)
onDeleteMultiNotes();
actionMode.finish();
return false;
}
};
// start action mode
startActionMode(actionModeCallback);
// hide fab button
fab.setVisibility(View.GONE);
actionModeCallback.setCount(chackedCount + "/" + notes.size());
}
private void onDeleteMultiNotes() {
//delete multi notes
List<Note> chackedNotes = adapter.getCheckedNotes();
if (chackedNotes.size() != 0) {
for (Note note : chackedNotes) {
dao.deleteNote(note);
}
// refresh Notes
loadNotes();
Toast.makeText(this, chackedNotes.size() + " Note(s) Deleted successfully !", Toast.LENGTH_SHORT).show();
} else Toast.makeText(this, "No Note(s) selected", Toast.LENGTH_SHORT).show();
adapter.setMultiCheckMode(false);
}
@Override
public void onActionModeFinished(ActionMode mode) {
super.onActionModeFinished(mode);
adapter.setMultiCheckMode(false); // uncheck the notes
adapter.setListener(this); // set back the old listener
fab.setVisibility(View.VISIBLE);
}
// swipe to right or to left to delete
private ItemTouchHelper swipeToDeleteHelper = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// delete note when swipe
if (notes != null) {
// get swiped note
Note swipedNote = notes.get(viewHolder.getAdapterPosition());
if (swipedNote != null) {
swipeToDelete(swipedNote, viewHolder);
}
}
}
});
private void swipeToDelete(final Note swipedNote, final RecyclerView.ViewHolder viewHolder) {
new AlertDialog.Builder(MainActivity.this)
.setMessage("Delete Note?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// delete note
dao.deleteNote(swipedNote);
notes.remove(swipedNote);
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
showEmptyView();
Toast.makeText(MainActivity.this, "Note deleted", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// TODO: 28/09/2018 Undo swipe and restore swipedNote
recyclerView.getAdapter().notifyItemChanged(viewHolder.getAdapterPosition());
}
})
.setCancelable(false)
.create().show();
}
}
Model class
package model;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import java.util.Comparator;
@Entity(tableName = "notes")
public class Note {
@PrimaryKey(autoGenerate = true)
private int id; // default value
@ColumnInfo(name = "text")
private String noteText;
@ColumnInfo(name = "date")
private long noteDate;
@Ignore // we don't want to store this value on database so ignore it
private boolean checked = false;
public Note() {
}
public static final Comparator<Note> BY_TITLE_ASCENDING = new Comparator<Note>() {
@Override
public int compare(Note o1, Note o2) {
return o1.getNoteText().compareTo(o2.getNoteText()) ;
}
};
public static final Comparator<Note> BY_TITLE_DESCENDING = new Comparator<Note>() {
@Override
public int compare(Note o1, Note o2) {
return o2.getNoteText().compareTo(o1.getNoteText()) ;
}
};
public Note(String noteText, long noteDate) {
this.noteText = noteText;
this.noteDate = noteDate;
}
public String getNoteText() {
return noteText;
}
public void setNoteText(String noteText) {
this.noteText = noteText;
}
public long getNoteDate() {
return noteDate;
}
public void setNoteDate(long noteDate) {
this.noteDate = noteDate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
@Override
public String toString() {
return "Note{" +
"id=" + id +
", noteDate=" + noteDate +
'}';
}
}
Please help me with this
Aucun commentaire:
Enregistrer un commentaire