0

構造の説明: 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を削除できます閉じています。リストに戻りました。リストには、削除されたアイテムが引き続き表示されます。リストを更新したい。

4

2 に答える 2