Search code examples
androidlistviewrestart

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


I'm building a book reader app and currently having some issues on how to move to next or previous chapter.

The fragment that is in charge of showing a list of chapter (basically a ListView). I capture the item with 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);
        }
});

It will start the ReaderActivity and display the content of the book. Now the ReaderActivity has 2 buttons for moving to next/previous chapter. How can I get the data (the name and url) from the ListView?

At the moment I'm thinking of two methods:

  1. Calling finish() on ReaderActivity and override the onDestroy() method to call a method to get the next/previous data in the fragment that holds the ListView.

  2. Passing the whole ArrayList of chapters to ReaderActivity so it can retrieve the item it wants (probably not a good solution since there are too many chapters).

Is there a better way?


Solution

  • There are way to many ways to get the best one.

    Some of them:

    1. Use your Application.java to share in-memory data (data stores) from any place. Example:

      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. Make your list a static member with a public static getter and then reference is from your ReaderActivity

      public final ApplicationActivity extends Activity {
          private static List<Chapter> chapters;
      
          ....
      
          public static List<Chapter> getChapters() {
              return chapters;
      }
      
    3. Store the list in shared preferences so any activity can reference it

    4. Include the list of chapters in your intent extras and pass it to your ReaderActivity

    I think your ReaderActivity needs to deal with the whole book rather a single chapter. Which means approach (4) is most likely a good candidate.