Обновить списокПросмотр при использовании onActivityResult

Объяснение структуры: В MainActivity у меня есть меню ящика и фрагмент для отображения содержимого. Из ящика я могу выбрать категорию, а список предметов в этой категории читается из базы данных и отображается в спискеView в фрагменте содержимого.

Когда щелкнут элемент из списка, появится функция DetailActivity.

Проблема. В DetailActivity есть кнопка для удаления элемента из базы данных. При нажатии этого элемента функция DetailActivity закрывается. И отображается предыдущий фрагмент содержимого в MainActivity. (например, нажатие кнопки возврата). Но проблема в том, что элемент, который я удалил, все еще отображается в спискеView. Я перешел в соответствующую категорию, чтобы обновлять listView и этот элемент больше не существует.

Что я ожидаю: я хочу, чтобы при удалении элемента в DetailActivity и возврате к предыдущему действию, listView автоматически обновляется.

Что я сделал: я знаю, что могу использовать onActivityResult следующим образом:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); // Refresh Bookmarks page when a bookmark is deleted if (requestCode == LESSON_DETAIL_ACTIVITY && resultCode == -1) { datasource.open(); lessons = datasource.findMyLessons(); refreshDisplay(context, view, category, i); // Problem Here! }
}

Как вы видите, мой метод refreshDisplay содержит 4 аргумента. Первоначально эти аргументы отправляются в DetailActivity. (когда элемент списка щелкнут во фрагменте внутри MainActivity) Когда я нажимаю кнопку "Удалить элемент" в DetailActivity и закрывается. Я не знаю, как получить этот аргумент, чтобы обновить список.

Здесь я размещаю код моего метода refreshDisplay и как я его называю на всякий случай, когда это необходимо. Я вызываю метод refreshDisplay внутри фрагмента (в MainActivity), а сам refreshDisplay находится в MainActivity.

public static class contentFragment extends Fragment { public static final String ARG_CATEGORY_NUMBER = "category_number"; public contentFragment() { // Empty constructor required for fragment subclasses } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_content, container, false); int i = getArguments().getInt(ARG_CATEGORY_NUMBER); String category = getResources().getStringArray(R.array.category)[i]; ((MainActivity) this.getActivity()).refreshDisplay(this.getActivity(),rootView, category, i); getActivity().setTitle(category); return rootView; }
}

мой метод refreshDisplay:

public void refreshDisplay(Context context, View view, String category, int i) { List<lesson> lessonByCategory = datasource.findByCategory(category, i); final ListView lv = (ListView) view.findViewById(R.id.listView); final ArrayAdapter<lesson> adapter = new LessonListAdapter(context, lessonByCategory); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick (AdapterView<!--?--> parent, View view, int position, long id) { Log.i(LOGTAG, "onListItemClick called"); ArrayAdapter<lesson> m_adapter = adapter; // get the Lesson object for the clicked row Lesson lesson = m_adapter.getItem(position); // use this if your 'refreshDisplay()' method is in your activity Intent intent = new Intent(MainActivity.this, LessonDetailActivity.class); isStared = datasource.isStared(lesson); intent.putExtra(".model.Lesson", lesson); intent.putExtra("isStared", isStared); startActivityForResult(intent, LESSON_DETAIL_ACTIVITY); } }); }
</lesson></lesson></lesson>

Кто-нибудь может мне помочь, пожалуйста!

Изменить 1: В моем коде в onActivityResult я вызвал refreshDisplay (контекст, представление, категория, i); Но, пожалуйста, обратите внимание, что те аргументы, которые я прошел, не определены. Без правильных аргументов refreshDisplay не работает!

Изменить 2: У меня есть навигационная панель, содержащая список категорий. Когда я нажимаю на одну из категорий, в моем фрагменте контента onCreateView вызывает refreshDisplay ** и помещает аргументы context & View плюс category & i, которые являются именем и позицией выбранной категории. Теперь refreshDisplay принимает эти аргументы и создает список элементов этой категории и показывает его в фрагменте содержимого. refreshDisplay имеет адаптер списка и прослушиватель, который при нажатии открывается DetailActivity. From DetailActivity Я могу удалить этот элемент, а функция DetailActivity закрыта. Я вернулся к списку. В списке по-прежнему отображается удаленный элемент. Я хочу обновить список.

2 ответа

Решение:-

объявить свой список listCategory static в вашем классе Activity (глобальная переменная)объявите свой listView как переменную экземпляра вашего класса активности.В DetailActivity удалите элемент listCategory (вы можете получить к нему доступ, потому что он статичен) следующим образом:
MainActivity.listCategory.remove(<the position="" of="" that="" detail="">);
</the>

объявите ваш адаптер также как переменную экземпляра вашего класса активности.нет необходимости в вашем методе refreshDisplay, просто используйте метод adapter.notifyDataSetChanged() в методе onActivityResult()


Просто попробуйте мои подсказки на вашем коде.... Я надеюсь, что это может решить вашу проблему

  1. вызовите этот метод после удаления элемента из адаптера. Он обновит содержимое адаптера.

    notifyDataSetChanged()

  2. Вы можете передать контекст следующему методу в качестве первого параметра.

    refreshDisplay (/* this.getActivity()/context, rootView, category, i);

licensed under cc by-sa 3.0 with attribution.