From 354618ccab2965b6500146d8b1fd0cfa9ae81cf0 Mon Sep 17 00:00:00 2001 From: geoffroy Date: Sat, 28 Nov 2015 14:16:54 -0500 Subject: [PATCH] Task list is updated in the tab where a new task is created --- .../donext/activities/MainActivity.java | 26 +++++++---- .../SmartFragmentStatePagerAdapter.java | 45 +++++++++++++++++++ .../geoffroy/donext/adapters/TaskAdapter.java | 14 +++++- .../donext/database/TaskDataAccess.java | 13 ++++-- .../{TaskFragment.java => TasksFragment.java} | 8 ++-- .../main/res/layout/fragment_task_list.xml | 2 +- 6 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java rename DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/{TaskFragment.java => TasksFragment.java} (94%) diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java index 9be2280..0ded88e 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java @@ -3,7 +3,6 @@ package com.wismna.geoffroy.donext.activities; import android.app.Dialog; import android.app.DialogFragment; import android.content.Intent; -import android.database.Cursor; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; @@ -11,6 +10,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; @@ -20,16 +20,18 @@ import android.widget.RadioGroup; import android.widget.Spinner; import com.wismna.geoffroy.donext.R; +import com.wismna.geoffroy.donext.adapters.SmartFragmentStatePagerAdapter; +import com.wismna.geoffroy.donext.adapters.TaskAdapter; import com.wismna.geoffroy.donext.dao.Task; import com.wismna.geoffroy.donext.dao.TaskList; import com.wismna.geoffroy.donext.database.TaskDataAccess; import com.wismna.geoffroy.donext.database.TaskListDataAccess; import com.wismna.geoffroy.donext.fragments.NewTaskFragment; -import com.wismna.geoffroy.donext.fragments.TaskFragment; +import com.wismna.geoffroy.donext.fragments.TasksFragment; import java.util.List; -public class MainActivity extends AppCompatActivity implements NewTaskFragment.NewTaskListener, TaskFragment.OnListFragmentInteractionListener { +public class MainActivity extends AppCompatActivity implements NewTaskFragment.NewTaskListener, TasksFragment.OnListFragmentInteractionListener { protected TaskDataAccess taskDataAccess; /** @@ -122,20 +124,26 @@ public class MainActivity extends AppCompatActivity implements NewTaskFragment.N } @Override public void onDialogPositiveClick(DialogFragment dialog) { + // Get the dialog fragment Dialog dialogView = dialog.getDialog(); + // Get the controls Spinner listSpinner = (Spinner) dialogView.findViewById(R.id.new_task_list); EditText nameText = (EditText) dialogView.findViewById(R.id.new_task_name); EditText descText = (EditText) dialogView.findViewById(R.id.new_task_description); RadioGroup priorityGroup = (RadioGroup) dialogView.findViewById(R.id.new_task_priority); RadioButton priorityRadio = (RadioButton) dialogView.findViewById(priorityGroup.getCheckedRadioButtonId()); - Cursor cursor = taskDataAccess.createTask( + TaskList taskList = (TaskList) listSpinner.getSelectedItem(); + // Add the task to the database + Task task = taskDataAccess.createTask( nameText.getText().toString(), descText.getText().toString(), priorityRadio.getText().toString(), - ((TaskList) listSpinner.getSelectedItem()).getId()); + taskList.getId()); - // TODO: uncomment after successfully creating adapter - //adapter.changeCursor(cursor); + // Update the corresponding tab adapter + TasksFragment taskFragment = (TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(listSpinner.getSelectedItemPosition()); + TaskAdapter taskAdapter = ((TaskAdapter)((RecyclerView)taskFragment.getView()).getAdapter()); + taskAdapter.add(task, taskAdapter.getItemCount()); } @Override @@ -176,7 +184,7 @@ public class MainActivity extends AppCompatActivity implements NewTaskFragment.N * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ - public class SectionsPagerAdapter extends FragmentPagerAdapter { + public class SectionsPagerAdapter extends SmartFragmentStatePagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); @@ -186,7 +194,7 @@ public class MainActivity extends AppCompatActivity implements NewTaskFragment.N public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). - return TaskFragment.newInstance(taskLists.get(position).getId()); + return TasksFragment.newInstance(taskLists.get(position).getId()); } @Override diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java new file mode 100644 index 0000000..6179dd0 --- /dev/null +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java @@ -0,0 +1,45 @@ +package com.wismna.geoffroy.donext.adapters; + +/** + * Created by geoffroy on 15-11-28. + */ + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.util.SparseArray; +import android.view.ViewGroup; + +/** + Extension of FragmentStatePagerAdapter which intelligently caches + all active fragments and manages the fragment lifecycles. + Usage involves extending from SmartFragmentStatePagerAdapter as you would any other PagerAdapter. +*/ +public abstract class SmartFragmentStatePagerAdapter extends FragmentStatePagerAdapter { + // Sparse array to keep track of registered fragments in memory + private SparseArray registeredFragments = new SparseArray<>(); + + public SmartFragmentStatePagerAdapter(FragmentManager fragmentManager) { + super(fragmentManager); + } + + // Register the fragment when the item is instantiated + @Override + public Object instantiateItem(ViewGroup container, int position) { + Fragment fragment = (Fragment) super.instantiateItem(container, position); + registeredFragments.put(position, fragment); + return fragment; + } + + // Unregister when the item is inactive + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + registeredFragments.remove(position); + super.destroyItem(container, position, object); + } + + // Returns the fragment for the position (if instantiated) + public Fragment getRegisteredFragment(int position) { + return registeredFragments.get(position); + } +} diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java index ebae310..df12cb0 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java @@ -8,14 +8,13 @@ import android.widget.TextView; import com.wismna.geoffroy.donext.R; import com.wismna.geoffroy.donext.dao.Task; -import com.wismna.geoffroy.donext.fragments.TaskFragment.OnListFragmentInteractionListener; +import com.wismna.geoffroy.donext.fragments.TasksFragment.OnListFragmentInteractionListener; import java.util.List; /** * {@link RecyclerView.Adapter} that can display a {@link Task} and makes a call to the * specified {@link OnListFragmentInteractionListener}. - * TODO: Replace the implementation with code for your data type. */ public class TaskAdapter extends RecyclerView.Adapter { @@ -57,6 +56,17 @@ public class TaskAdapter extends RecyclerView.Adapter { return mValues.size(); } + public void add(Task item, int position) { + mValues.add(position, item); + notifyItemInserted(position); + } + + public void remove(Task item) { + int position = mValues.indexOf(item); + mValues.remove(position); + notifyItemRemoved(position); + } + public class ViewHolder extends RecyclerView.ViewHolder { public final View mView; public final TextView mIdView; diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java index a2e1eee..1b8aaf9 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java @@ -40,14 +40,21 @@ public class TaskDataAccess { public void close() { dbHelper.close(); } - public Cursor createTask(String name, String description, String priority, long taskList) { + public Task createTask(String name, String description, String priority, long taskList) { ContentValues values = new ContentValues(); values.put(DatabaseHelper.TASKS_COLUMN_NAME, name); values.put(DatabaseHelper.TASKS_COLUMN_DESC, description); values.put(DatabaseHelper.TASKS_COLUMN_PRIORITY, priorities.indexOf(priority)); values.put(DatabaseHelper.TASKS_COLUMN_LIST, taskList); - database.insert(DatabaseHelper.TASKS_TABLE_NAME, null, values); - return getAllTasksCursor(); + long insertId = database.insert(DatabaseHelper.TASKS_TABLE_NAME, null, values); + + Cursor cursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, + taskColumns, DatabaseHelper.COLUMN_ID + " = " + insertId, null, + null, null, null); + cursor.moveToFirst(); + Task newTask = cursorToTask(cursor); + cursor.close(); + return newTask; } public Cursor deleteTask(Cursor taskCursor) { diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java similarity index 94% rename from DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFragment.java rename to DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java index 4cbda44..bbaa25e 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java @@ -20,7 +20,7 @@ import com.wismna.geoffroy.donext.database.TaskDataAccess; * Activities containing this fragment MUST implement the {@link OnListFragmentInteractionListener} * interface. */ -public class TaskFragment extends Fragment { +public class TasksFragment extends Fragment { private TaskDataAccess taskDataAccess; private static final String TASK_LIST_ID = "task_list_id"; @@ -31,12 +31,12 @@ public class TaskFragment extends Fragment { * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). */ - public TaskFragment() { + public TasksFragment() { } @SuppressWarnings("unused") - public static TaskFragment newInstance(long taskListId) { - TaskFragment fragment = new TaskFragment(); + public static TasksFragment newInstance(long taskListId) { + TasksFragment fragment = new TasksFragment(); Bundle args = new Bundle(); args.putLong(TASK_LIST_ID, taskListId); fragment.setArguments(args); diff --git a/DoNExt/app/src/main/res/layout/fragment_task_list.xml b/DoNExt/app/src/main/res/layout/fragment_task_list.xml index 526a62e..bb7dedc 100644 --- a/DoNExt/app/src/main/res/layout/fragment_task_list.xml +++ b/DoNExt/app/src/main/res/layout/fragment_task_list.xml @@ -9,5 +9,5 @@ android:layout_marginLeft="16dp" android:layout_marginRight="16dp" app:layoutManager="LinearLayoutManager" - tools:context=".fragments.TaskFragment" + tools:context=".fragments.TasksFragment" tools:listitem="@layout/fragment_task" />