2016-04-29 36 views
0

我有一個列表視圖,其中包含存儲在數據庫中的項目。當每個項目被點擊時,會彈出一個對話框片段,其中包含用於編輯和刪除的按鈕。點擊刪除時,該項目將從數據庫中刪除,對話框片段將被解除。但是,在列表視圖所在的主要活動中,數據不會更新。它仍然顯示我刪除的項目。有些人可以幫忙嗎?如何在關閉對話框片段後從數據庫刷新listview?

下面是代碼段:

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

在此先感謝!

回答

1

您可以通過回調片段中的主要活動來更新數據。公共方法添加到您的MainActivity

public void onUpdate() 
{ 
    refreshListView(); 
} 

,並在你的片段,當你刪除的內容,請使用以下在點擊監聽:

 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

謝謝..它的工作。我試圖早些時候實施相同的想法,但可能以錯誤的方式實施!乾杯! –

+0

@AtulRauthan很高興聽到!請接受答案,以便可以關閉問題 – Pooya

+1

完成。謝了哥們! –

0

你爲什麼不只是使用內置的聽衆DialogFragment。你可以做這樣的事情:

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

    } 

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

然後從數據庫中提取數據,將它傳遞給你的適配器,然後notifyDataSetChanged()將更新視圖。

0

您可以覆蓋onActivityResult(INT requestCode,INT resultCode爲,意圖數據)在MainActivity和setTargetFragment befoer出這樣PopupFragment:

pf.setTargetFragment(這一點,1);

在關閉對話框之前的片段對話框中,您必須調用getTargetFragment()。onActivityResult(/ * parameters * /),然後關閉對話框。

最後在你的activityResult中調用refreshListView()。

相關問題