我正在学习Android,在尝试开发应用程序时遇到了以下情况:
我的活动有两个Fragments
:ReminderListFragment
和FilterListFragment
。第一个片段有一个提醒列表,第二个片段有一个过滤器列表,其中包含每个过滤器中注册的项目名称和数量。但是,当我排除某些提醒时,FilterListFragment值不会更新。当我删除其中一个过滤器时会发生同样的事情(在这种情况下,它会删除所选过滤器的所有记录),它不会更新“提醒”列表。
FilterListFragment
代码:
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getGroupId() == R.id.context_menu_category) {
// Used to verify it it is the right context_menu //Gets the item
// position and gets the category in that position:
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Category category = ((CategoryFilter) lvFilters.getAdapter().getItem(info.position)).getCategory();
// Switch between the options in the context menu(Edit and Delete)
switch (item.getItemId()) {
case R.id.edit:
// Passes the current reminder to be edited via Intent and
// Invokes edit method
DialogFragment newFragment = EditCategoryDialogFragment.newInstance(category);
newFragment.show(getFragmentManager(), "" + R.string.dialog_editcategory_title);
updateListView();
return true;
case R.id.delete:
// Invokes delete method
try {
// Deletes from the bank;
Controller.instance(getActivity().getApplicationContext()).deleteReminderByCategory(category);
Controller.instance(getActivity().getApplicationContext()).deleteCategory(category);
updateListView();
return true;
} catch (DBException e) {
Log.e(TAG, e.getMessage());
}
updateListView();
return true;
default:
return super.onContextItemSelected(item);
}
}
return super.onContextItemSelected(item);
}
ReminderListFragment
代码:
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getGroupId() == R.id.context_menu_reminder) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Reminder reminder = (Reminder) contextMenuAdapter.getItem(info.position);
switch (item.getItemId()) {
case R.id.edit:
Intent editIntent = editIntent(reminder);
editIntent.putExtra("id", reminder.getId());
editIntent.putExtra("text", reminder.getText());
editIntent.putExtra("details", reminder.getDetails());
startActivity(editIntent);
updateListView(null);
return true;
case R.id.delete:
try {
Controller.instance(getActivity().getApplicationContext()).deleteReminder(reminder);
} catch (DBException e) {
Log.e(TAG, e.getMessage());
}
updateListView(null);
return true;
default:
return super.onContextItemSelected(item);
}
}
return super.onContextItemSelected(item);
}
答案 0 :(得分:7)
您应该通过活动与第二个片段进行通信。当您在一个片段中执行某些应该影响第二个片段的内容时,您应该在您的活动中调用一些方法,该方法将在第二个片段中调用update方法。 例如活动:
public class MainActivity extends Activity(){
private Fragment fragmentOne, fragmentTwo;
public void updateFragmentTwo(){
fragmentTwo.updateListView();
}
}
片段:
public class FirstFragment extends Fragment{
public void updateFragmentTwo(){
((MyActivity)getActivity()).updateFragmentTwo();
}
}
答案 1 :(得分:0)
对于通过单个活动进行片段到片段的通信,可以通过接口进行,或者我应该说回调。我认为通过在您的活动中实现接口,您可以与两个片段进行通信,并且当片段中的监听器被调用时,您可以相应地执行操作。正如我认为当你有一个活动包含两个片段时,你很容易知道哪个片段当前可见,以及你必须在哪里更新数据。 下面有一个关于实现活动和片段之间通信接口的链接。
希望它有所帮助!
答案 2 :(得分:0)
我正在寻找类似的东西,这对我有所帮助。 update listview dynamically with adapter
除此之外,您应该使用包,接口或意图传递数据
答案 3 :(得分:-2)
我可以通过添加以下方法来解决它:
在FilterListFragment
上课:
public void reloadReminderListFragment() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.listReminders);
if (currentFragment instanceof ReminderListFragment) {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();
}
}
在ReminderListFragment
上课:
public void reloadFilterListFragment() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.listCategories);
if (currentFragment instanceof FilterListFragment) {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();
}
}