[embedyt] https://www.youtube.com/watch?v=3WR4QAiVuCw[/embedyt]
Links & Dependenciesactivity_new_note.xmlNewNoteActivity.javaAndroidManifest.xmlNoteAdapter.javaMainActivity.javaactivity_main.xmlnote_item.xmlNote.javanew_note_menu.xml
Firebase console:
FirebaseUI GitHub page with dependencies & instructions:
github.com/firebase/FirebaseUI-Android
Other dependencies:
developer.android.com/topic/libraries/support-library/packages#v7-cardview
developer.android.com/topic/libraries/support-library/packages#design
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" tools:context=".NewNoteActivity"> <EditText android:id="@+id/edit_text_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Title" android:inputType="text" /> <EditText android:id="@+id/edit_text_description" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Description" android:inputType="textMultiLine" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Priority:" android:textAppearance="@android:style/TextAppearance.Medium" /> <NumberPicker android:id="@+id/number_picker_priority" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
package com.codinginflow.firebaseui_firestoreexample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.EditText; import android.widget.NumberPicker; import android.widget.Toast; import com.google.firebase.firestore.CollectionReference; import com.google.firebase.firestore.FirebaseFirestore; public class NewNoteActivity extends AppCompatActivity { private EditText editTextTitle; private EditText editTextDescription; private NumberPicker numberPickerPriority; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_note); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close); setTitle("Add Note"); editTextTitle = findViewById(R.id.edit_text_title); editTextDescription = findViewById(R.id.edit_text_description); numberPickerPriority = findViewById(R.id.number_picker_priority); numberPickerPriority.setMinValue(1); numberPickerPriority.setMaxValue(10); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.new_note_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.save_note: saveNote(); return true; default: return super.onOptionsItemSelected(item); } } private void saveNote() { String title = editTextTitle.getText().toString(); String description = editTextDescription.getText().toString(); int priority = numberPickerPriority.getValue(); if (title.trim().isEmpty() || description.trim().isEmpty()) { Toast.makeText(this, "Please insert a title and description", Toast.LENGTH_SHORT).show(); return; } CollectionReference notebookRef = FirebaseFirestore.getInstance() .collection("Notebook"); notebookRef.add(new Note(title, description, priority)); Toast.makeText(this, "Note added", Toast.LENGTH_SHORT).show(); finish(); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.codinginflow.firebaseui_firestoreexample"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NewNoteActivity" android:parentActivityName=".MainActivity" /> </application> </manifest>
package com.codinginflow.firebaseui_firestoreexample; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.firebase.ui.firestore.FirestoreRecyclerAdapter; import com.firebase.ui.firestore.FirestoreRecyclerOptions; import com.google.firebase.firestore.DocumentSnapshot; public class NoteAdapter extends FirestoreRecyclerAdapter<Note, NoteAdapter.NoteHolder> { private OnItemClickListener listener; public NoteAdapter(@NonNull FirestoreRecyclerOptions<Note> options) { super(options); } @Override protected void onBindViewHolder(@NonNull NoteHolder holder, int position, @NonNull Note model) { holder.textViewTitle.setText(model.getTitle()); holder.textViewDescription.setText(model.getDescription()); holder.textViewPriority.setText(String.valueOf(model.getPriority())); } @NonNull @Override public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_item, parent, false); return new NoteHolder(v); } public void deleteItem(int position) { getSnapshots().getSnapshot(position).getReference().delete(); } class NoteHolder extends RecyclerView.ViewHolder { TextView textViewTitle; TextView textViewDescription; TextView textViewPriority; public NoteHolder(View itemView) { super(itemView); textViewTitle = itemView.findViewById(R.id.text_view_title); textViewDescription = itemView.findViewById(R.id.text_view_description); textViewPriority = itemView.findViewById(R.id.text_view_priority); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION && listener != null) { listener.onItemClick(getSnapshots().getSnapshot(position), position); } } }); } } public interface OnItemClickListener { void onItemClick(DocumentSnapshot documentSnapshot, int position); } public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } }
package com.codinginflow.firebaseui_firestoreexample; import android.content.Intent; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; import android.widget.Toast; import com.firebase.ui.firestore.FirestoreRecyclerOptions; import com.google.firebase.firestore.CollectionReference; import com.google.firebase.firestore.DocumentSnapshot; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query; public class MainActivity extends AppCompatActivity { private FirebaseFirestore db = FirebaseFirestore.getInstance(); private CollectionReference notebookRef = db.collection("Notebook"); private NoteAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FloatingActionButton buttonAddNote = findViewById(R.id.button_add_note); buttonAddNote.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, NewNoteActivity.class)); } }); setUpRecyclerView(); } private void setUpRecyclerView() { Query query = notebookRef.orderBy("priority", Query.Direction.DESCENDING); FirestoreRecyclerOptions<Note> options = new FirestoreRecyclerOptions.Builder<Note>() .setQuery(query, Note.class) .build(); adapter = new NoteAdapter(options); RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); 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) { adapter.deleteItem(viewHolder.getAdapterPosition()); } }).attachToRecyclerView(recyclerView); adapter.setOnItemClickListener(new NoteAdapter.OnItemClickListener() { @Override public void onItemClick(DocumentSnapshot documentSnapshot, int position) { Note note = documentSnapshot.toObject(Note.class); String id = documentSnapshot.getId(); String path = documentSnapshot.getReference().getPath(); Toast.makeText(MainActivity.this, "Position: " + position + " ID: " + id, Toast.LENGTH_SHORT).show(); } }); } @Override protected void onStart() { super.onStart(); adapter.startListening(); } @Override protected void onStop() { super.onStop(); adapter.stopListening(); } }
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.FloatingActionButton android:id="@+id/button_add_note" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" android:src="@drawable/ic_add" /> </android.support.design.widget.CoordinatorLayout>
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:cardBackgroundColor="#FFFFE8"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp"> <TextView android:id="@+id/text_view_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_toStartOf="@id/text_view_priority" android:ellipsize="end" android:maxLines="1" android:text="Title" android:textAppearance="@style/TextAppearance.AppCompat.Large" /> <TextView android:id="@+id/text_view_priority" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" android:text="1" android:textAppearance="@style/TextAppearance.AppCompat.Large" /> <TextView android:id="@+id/text_view_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_below="@id/text_view_title" android:text="Description" /> </RelativeLayout> </android.support.v7.widget.CardView>
package com.codinginflow.firebaseui_firestoreexample; public class Note { private String title; private String description; private int priority; public Note() { //empty constructor needed } public Note(String title, String description, int priority) { this.title = title; this.description = description; this.priority = priority; } public String getTitle() { return title; } public String getDescription() { return description; } public int getPriority() { return priority; } }
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/save_note" android:icon="@drawable/ic_save" android:title="Save" app:showAsAction="ifRoom" /> </menu>