構造の説明: MainActivity には、コンテンツを表示するためのドロワー メニューとフラグメントがあります。ドロワーからカテゴリを選択すると、そのカテゴリのアイテムのリストがデータベースから読み取られ、コンテンツ フラグメントの listView に表示されます。
リスト ビューの項目をクリックすると、DetailActivity が開始されます。
問題: DetailActivity に、データベースからアイテムを削除するボタンがあります。この項目が押されると、DetailActivity が閉じます。MainActivity の前のコンテンツ フラグメントが表示されます。(戻るボタンを押すのと同じように)しかし、問題は、削除したアイテムがまだlistViewに表示されていることです。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 メソッドのコードと、必要な場合に備えてそれを呼び出す方法を投稿します。フラグメント内 (MainActivity 内) で refreshDisplay メソッドを呼び出し、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);
}
});
}
誰でも私を助けてもらえますか?
編集 1:私のコードでは、onActivityResultでrefreshDisplay(context, view, category, i);を呼び出しました。ただし、渡した引数が定義されていないことに注意してください。正しい引数がなければ、refreshDisplay は機能しません!
編集 2:カテゴリのリストを含むドロワー ナビゲーションがあります。カテゴリの 1 つをクリックすると、コンテンツ フラグメントでonCreateViewがrefreshDisplay ** を呼び出し、コンテキストとビューの引数に加えて、選択したカテゴリの名前と位置であるカテゴリと i を配置します。refreshDisplayはこれらの引数を受け取り、そのカテゴリのアイテムのリストを作成し、コンテンツ フラグメントに表示します。refreshDisplay には、クリックするとDetailActivityを開くリスト アダプターとリスナーがあります。DetailActivityから、その項目とDetailActivityを削除できます閉じています。リストに戻りました。リストには、削除されたアイテムが引き続き表示されます。リストを更新したい。