2016-04-29 6 views
0

Ich habe eine Listenansicht, die Elemente enthält, die in einer Datenbank gespeichert sind. Wenn auf jedes Element geklickt wird, erscheint ein Dialogfragment mit Schaltflächen zum Bearbeiten und Löschen. Wenn Sie auf Löschen klicken, wird das Objekt aus der Datenbank gelöscht und das Dialogfeldfragment wird geschlossen. In der Hauptaktivität, in der sich die Listenansicht befindet, werden die Daten jedoch nicht aktualisiert. Es zeigt immer noch den Artikel, den ich gelöscht habe. Bitte helfen Sie mir dabei?Wie aktualisiere ich Listenansicht aus der Datenbank nach dem Schließen eines Dialogfragments?

Hier sind die Code-Schnipsel:

/******* 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); 
      } 
     }); 
    } 

Vielen Dank im Voraus!

Antwort

1

Sie können einen Rückruf für die Hauptaktivität von Ihrem Fragment ausführen, um Daten zu aktualisieren. Fügen Sie eine öffentliche Methode zu Ihrem MainActivity:

public void onUpdate() 
{ 
    refreshListView(); 
} 

und in Ihrem Fragment, wenn Sie den Inhalt der folgenden in auf Ihrem Klick-Listener verwenden gelöscht:

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

danke .. es hat funktioniert. Ich habe versucht, die gleiche Idee früher, aber wahrscheinlich falsch umzusetzen! Prost! –

+0

@AtulRauthan gut das zu hören! Bitte akzeptieren Sie die Antwort, damit die Frage geschlossen werden kann – Pooya

+1

Fertig. Danke Kumpel! –

0

Warum Sie nicht einfach den integrierten Einsatz in Listener auf DialogFragment. Sie können etwas tun:

PopupFragment pf = PopupFragment.newInstance(taskDetails); 
pf.onDismiss(new DialogInterface() { 
    @Override 
    public void cancel() { 

    } 

    @Override 
    public void dismiss() { 
     refreshListView(); 
    } 
}); 

dann die Daten aus Ihrer Datenbank ziehen, gibt sie an den Adapter und dann wird notifyDataSetChanged() die Ansicht aktualisieren.

0

Sie können außer Kraft setzen onActivityResult (int requestCode, int Result, Intent-Daten) in Ihrem MainActivity und setTargetFragment befoer PopupFragment zeigt wie folgt aus:

pf.setTargetFragment (this, 1);

Bevor Sie den Dialog verlassen, müssen Sie in Ihrem Fragmentdialog getTargetFragment(). OnActivityResult (/ * parameters * /) aufrufen und dann den Dialog schließen.

Und schließlich in Ihrer activityResult Aufruf refreshListView().

Verwandte Themen