【问题标题】:Refresh listView on return using onActivityResult使用 onActivityResult 返回时刷新 listView
【发布时间】:2013-12-26 10:38:58
【问题描述】:

解释结构: 在 MainActivity 我有一个抽屉菜单和一个显示内容的片段。从抽屉中,我可以选择一个类别,然后从数据库中读取该类别中的项目列表,并显示在内容片段的 listView 中。

单击列表视图中的项目时,将启动 DetailActivity。

问题: 在 DetailActivity 中有一个用于从数据库中删除项目的按钮。按下此项目时,DetailActivity 将关闭。并显示 MainActivity 中之前的内容片段。 (就像按下后退按钮) 但问题是我删除的项目仍然显示在 listView 中。我已转到相关类别,以便 listView 刷新并且该项目不再存在。

我的期望:我想要的是当我删除DetailActivity中的item并返回到上一个activity时,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: 我有一个包含类别列表的抽屉式导航。当我单击其中一个类别时,在我的内容片段中,onCreateView 调用 refreshDisplay ** 并放置 contextView 参数加上 categoryi 是所选类别的名称和位置。现在 refreshDisplay 接受这些参数并创建该类别的项目列表并将其显示在内容片段中。 refreshDisplay 有一个列表适配器和侦听器,单击时会打开 DetailActivity。从 DetailActivity 我可以删除该项目并且 DetailActivity 已关闭。我回到名单上。该列表仍显示已删除的项目。我想更新列表。

【问题讨论】:

  • 你为什么每次都创建新列表并设置适配器?您是否尝试通过调用列表视图的 notifyDataSetChanged() 方法?
  • kameshwari 是正确的,但如果在 listByCategory 中删除了项目,您的代码应该可以工作。因此,在您的 refreshDisplay(..) 方法中,您应该删除刚刚在您的 detailactivity 中删除的项目。您明白我的意思吗?
  • @Kameswari (1) 我有一个 listView。因此,每次单击不同的类别时,listView 都会填充相关项目。 (2) 我不熟悉 notifyDataSetChanged()。会有什么帮助?
  • 你不能只返回已删除的项目ID或其他东西..以便您可以将其从列表中删除吗?
  • @KailashDabhi 我不知道给 refreshDisplay 方法提供什么参数。如果我知道如何检索参数,那么我的问题就解决了。但我不知道如何获得它们!

标签: android android-listview android-fragments onactivityresult


【解决方案1】:

试试我对你的代码的提示......我希望它可以解决你的问题

  1. 从适配器中删除项目后调用此方法。它将刷新适配器内容。

    notifyDataSetChanged()

  2. 您可以将上下文作为第一个参数传递给以下方法..

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

【讨论】:

  • 1.我是安卓新手。我的适配器在 refreshDisplay 和它的最后。那么如何在 onActivityResult adapter.notifyDataSetChanged(); 中使用适配器
  • 2.在上述情况下,没有可用于“this”的“getActivity()”方法。
【解决方案2】:

解决办法:-

  • 在您的 Activity 类(全局变量)中声明您的列表 listCategory 静态
  • 将您的 listView 声明为您的活动类的实例变量。
  • 在 DetailActivity 中删除 listCategory 项(您可以访问它,因为它是静态的) 像这样:-
          MainActivity.listCategory.remove(<the position of that detail>);
    

  • 将您的适配器也声明为您的活动类的实例变量。
  • 不需要您的 refreshDisplay 方法,只需在 onActivityResult() 方法中使用 adapter.notifyDataSetChanged()
  • 【讨论】:

    • 如何在 onActivityResult() 中获取对适配器的引用,以便使用 adapter.notifyDataSetChanged()
    • 查看更新的答案。实际上,当您将适配器设置为活动类的实例变量时,您会自动获取适配器的引用,因为它是活动类的本地对象
    • 我的适配器在 refreshDisplay 内。根据从另一个列表中选择的类别,适配器列出不同的项目。现在,如果我想在 onActivityResult() 中使用 adapter.notifyDataSetChanged(),我需要对 adapter 的引用。我该怎么做?
    • 您使用的 listCategory 是什么?是我用的listView吗?
    • 它是您用于列表视图的列表
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多