Search code examples
androidlistviewandroid-cursoradapterdialogfragment

How to refresh listview from database after dismissing a dialog fragment?


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!


Solution

  • 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();
            }