如何使用 ListView 的上一个或下一个位置的数据重新启动 activity

How to restart activity with data of previous or next position of a ListView

我正在构建一本书 reader 应用程序,目前在如何转到下一章或上一章方面遇到一些问题。

负责显示章节列表的片段(基本上是一个ListView)。我使用 onItemClick:

捕获项目
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Intent intent = new Intent(getActivity().getApplicationContext(),ReaderActivity.class);
            intent.putExtra("name",adapter.getItem(i).getName());
            intent.putExtra("url",adapter.getItem(i).getUrl());
            startActivity(intent);
        }
});

它将启动ReaderActivity并显示本书的内容。现在 ReaderActivity 有 2 个按钮可以移动到 next/previous 章节。如何从 ListView 获取数据(nameurl)?

目前我在想两种方法:

  1. ReaderActivity 上调用 finish() 并覆盖 onDestroy() 方法以调用一个方法来获取保存片段中的 next/previous 数据列表显示。

  2. 将整个 ArrayList 的章节传递给 ReaderActivity 以便它可以检索它想要的项目(可能不是一个好的解决方案,因为章节太多)。

有没有更好的方法?

我会将列表数据放在 Application class(或另一个单例)中,然后 ReaderActivity 就可以为下一章查询它。实际上,它可以只获取下一章的详细信息并相应地更新其内容,根本不需要创建新的 activity。

有很多方法可以获得最好的。

其中一些:

  1. 使用您的 Application.java 从任何地方共享内存数据(数据存储)。示例:

    public final Application extends android.app.Application {
        private List<Chapter> chapters;
    
        public void setChapters(List<Chapter> chapters) {
            this.chapters = chapters != null ? chapters : Collections.<Chapter>epmtyList();
        }
    
        public List<Chapter> get Chapters() {
            return chapters;
        }
    }
    
    // from any place which has context (or is context)
    List<Chapter> chapters = ((Application) getContext().getApplicationContext()).getChapters();
    
  2. 使用 public 静态 getter 使您的列表成为静态成员,然后引用来自您的 ReaderActivity

    public final ApplicationActivity extends Activity {
        private static List<Chapter> chapters;
    
        ....
    
        public static List<Chapter> getChapters() {
            return chapters;
    }
    
  3. 将列表存储在共享首选项中,以便任何 activity 都可以引用它

  4. 将章节列表包含在您的 intent extra 中并将其传递给您的 ReaderActivity

我认为您的 ReaderActivity 需要处理整本书而不是单个章节。这意味着方法 (4) 很可能是一个不错的选择。