I have a list view which contains items stored in a database. When each item is clicked, a dialog fragment pops up which has buttons for editing and deleting. When clicking on delete, the item gets deleted from the database and the dialog fragment is dismissed. However, on the main activity, where the list view resides, the data is not updated. It still shows the item that I deleted. Some help on this please?
Here are the code snippets :
/*******MainActivity*********/
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private ListView taskListView;
private DataModel data;
private DatabaseHandler db = new DatabaseHandler(this);
private SimpleCursorAdapter adapter;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
taskListView = (ListView) findViewById(R.id.task_list_view);
refreshListView();
}
private void showPopupDialog(String[] taskDetails) {
FragmentManager fm = getSupportFragmentManager();
PopupFragment pf = PopupFragment.newInstance(taskDetails);
pf.show(fm,"activity_popup_fragment");
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
int currentPosition;
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
Toast.makeText(this,"Task Completed",Toast.LENGTH_LONG).show();
return true;
case R.id.delete:
Toast.makeText(this,"Task Deleted",Toast.LENGTH_LONG).show();
db.deleteTask((int)info.id);
refreshListView();
return true;
default:
return super.onContextItemSelected(item);
}
}
protected void refreshListView() {
cursor = db.queueAllTasks();
String[] from = new String[] {"taskName","taskDesc","taskDate","taskTime","id"};
int[] to = new int[] {R.id.text};
adapter = new SimpleCursorAdapter(this, R.layout.row_item, cursor, from, to);
taskListView.setAdapter(adapter);
taskListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Cursor cursor = (Cursor) taskListView.getItemAtPosition(i);
String taskDetails[] = {cursor.getString(cursor.getColumnIndexOrThrow("taskName")),
cursor.getString(cursor.getColumnIndexOrThrow("taskDesc")),
cursor.getString(cursor.getColumnIndexOrThrow("taskDate")),
cursor.getString(cursor.getColumnIndexOrThrow("taskTime")),
cursor.getString(cursor.getColumnIndexOrThrow("id"))};
showPopupDialog(taskDetails);
}
});
registerForContextMenu(taskListView);
}
/***********PopupFragment***********/
public class PopupFragment extends DialogFragment {
TextView name, desc, reminder;
String remindAt;
Button delBtn, editBtn;
DatabaseHandler db;
public PopupFragment() {
}
public static PopupFragment newInstance(String[] taskDetails) {
PopupFragment frag = new PopupFragment();
Bundle args = new Bundle();
args.putString("TaskName", taskDetails[0]);
args.putString("TaskDesc", taskDetails[1]);
args.putString("TaskDate", taskDetails[2]);
args.putString("TaskTime", taskDetails[3]);
args.putInt("TaskId", Integer.parseInt(taskDetails[4]));
frag.setArguments(args);
return frag;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_popup_fragment,container);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
name = (TextView) view.findViewById(R.id.popTaskName);
desc = (TextView) view.findViewById(R.id.popTaskDesc);
delBtn = (Button) view.findViewById(R.id.del_btn);
editBtn = (Button) view.findViewById(R.id.edit_btn);
reminder = (TextView) view.findViewById(R.id.popTaskRemind);
db = new DatabaseHandler(getActivity());
remindAt = "Remind me on "+getArguments().getString("TaskDate") +" at "+ getArguments().getString("TaskTime");
name.setText(getArguments().getString("TaskName"));
desc.setText(getArguments().getString("TaskDesc"));
reminder.setText(remindAt);
delBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
db.deleteTask(getArguments().getInt("TaskId"));
getDialog().dismiss();
Toast.makeText(getContext(),"Task Deleted",Toast.LENGTH_LONG).show();
}
});
editBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getContext(),EditTask.class);
intent.putExtra("TaskId", getArguments().getInt("TaskId"));
intent.putExtra("TaskName", getArguments().getString("TaskName"));
intent.putExtra("TaskDesc", getArguments().getString("TaskDesc"));
intent.putExtra("TaskDate", getArguments().getString("TaskDate"));
intent.putExtra("TaskTime", getArguments().getString("TaskTime"));
startActivity(intent);
}
});
}
Thanks in Advance!
You can have a callback to main activity from your fragment to update data. Add a public method to your MainActivity
:
public void onUpdate()
{
refreshListView();
}
and in your fragment when you deleted the content use the following in on your click listener:
public void onClick(View view) {
db.deleteTask(getArguments().getInt("TaskId"));
getDialog().dismiss();
Toast.makeText(getContext(),"Task Deleted",Toast.LENGTH_LONG).show();
MainActivity activity = (MainActivity) getActivity();
activity.onUpdate();
}