Как сделать список объектов, разбираемых на части в Android?


Итак, у меня есть приложение, которое ищет исполнителя в интернете, через API и отображает список результатов (имена исполнителей) после выполнения этого поиска под рукой. Я хочу сохранить этот список, поскольку я изменяю ориентацию (книжная - альбомная) моего устройства и не должен выполнять поиск снова. Вот некоторый код:

public class MainActivityFragment extends Fragment{

    public static final String ARTIST_ID = "artistId";
    private final String NO_RESULTS = "No artists found. Please check your input!";

    private List<Artist> artists = new ArrayList<>();
    private ArtistArrayAdapter adapter;

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        final SearchView searchView = (SearchView) rootView.findViewById(R.id.search_artist);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String artistName) {
                SearchArtist(artistName);
                InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });

        ListView listView = (ListView) rootView.findViewById(android.R.id.list);
        adapter = new ArtistArrayAdapter(getActivity(), R.layout.artist_list_item, artists);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Artist artist = artists.get(position);
                String artistId = artist.id;
                Intent detailArtist = new Intent(getActivity(), DetailActivity.class);
                detailArtist.putExtra(ARTIST_ID, artistId);
                startActivity(detailArtist);
            }
        });

        return rootView;
    }

Поэтому я думаю, что мне нужно сделать список художников разборчивым, а затем передать его в метод onSaveInstanceState. Но как же составить этот список parcelable?

Большое спасибо, я надеюсь, что это не слишком запутанно...

3 4

3 ответа:

Вам потребуется реализовать Parcelable интерфейс для вашего класса модели данных исполнителя. Например

public class ArtistParcelable implements Parcelable {
    public String id;
    public String artistName;
    public List<String> artistImageUrls = Collections.emptyList();

    public ArtistParcelable(Artist artist) {
        // Do the assignments here
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //write 
        dest.writeString(this.id);
        dest.writeString(this.artistName);
        dest.writeStringList(this.artistImageUrls);
    }

    protected ArtistParcelable(Parcel in) {
        //retrieve
        this.id = in.readString();
        this.artistName = in.readString();
        this.artistImageUrls = in.createStringArrayList();
    }

    public static final Parcelable.Creator<ArtistParcelable> CREATOR = new Parcelable.Creator<ArtistParcelable>() {
        public ArtistParcelable createFromParcel(Parcel source) {
            return new ArtistParcelable(source);
        }

        public ArtistParcelable[] newArray(int size) {
            return new ArtistParcelable[size];
        }
    };
}

И в вашем фрагменте-если у вас есть список мартистов, то вы сохраняете и извлекаете список, как

@Override
public void onSaveInstanceState(final Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList(ARTISTS, (ArrayList<? extends Parcelable>) mArtists);
}

И в onCreateView

if (savedInstanceState != null) {
        mArtists = savedInstanceState.getParcelableArrayList(ARTISTS);
Вот хороший путеводитель, которому вы можете следовать. https://guides.codepath.com/android/Using-Parcelable

Есть IDE плагин под названием Android Parcelable Code Generator , который также генерирует весь шаблонный код для вас.

И есть также библиотека под названием Parceler, которая довольно удобна. Он полностью удаляет шаблонную плиту.

Сначала класс Artist должен реализовать parcelable

public class Artist implements Parcelable

Затем вы должны переопределить метод writeToParcel, говоря, что вы хотите сохранить, например:

  @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mSavedString);
     }

Создайте конструктор для чтения сохраненных переменных:

 protected Artist(Parcel in){
    mSavedString = in.readString();
}

Тогда Творец:

 public static final Parcelable.Creator<Artist> CREATOR
             = new Parcelable.Creator<Artist>() {
         public Artist createFromParcel(Parcel in) {
             return new Artist(in);
         }

         public Artist[] newArray(int size) {
             return new Artist[size];
         }
     };

И, наконец, на вашем Activity override onsavedinstance:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArray("AristArray", mArtistArray);
}

Кроме того, не забудьте повторить, сделав это onCreate вашей деятельности:

 if (savedInstanceState != null) {
   mArtistArray= new List<Artist>(savedInstanceState.getParcelableArray("ArtistArray"));
 }

Ps: не пробовал код, так ничего у тебя хотите знать спрашивайте, я постараюсь вам помочь;)

Src: http://developer.android.com/reference/android/os/Parcelable.html

Надеюсь, что это поможет ;)

Как насчет изменения класса Artist, чтобы сделать его Parcelabel.

public class Artist implements Parcelable {

    public static final Creator<Artist> CREATOR = new Creator<Artist>() {
        public Artist createFromParcel(Parcel source) {
            return new Artist(source);
        }

        public Artist[] newArray(int size) {
            return new Artist[size];
        }
    };

    private final String name;

    public Artist(String name) {
        this.name = name;
    }

    private Artist(Parcel in) {
        name = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public String getName() {
        return name;
    }
}

Затем используйте следующее.

protected void onSaveInstanceState(Bundle outState) {
 outState.putParcelableArrayList("key_artists",artists);
}