Как сделать список объектов, разбираемых на части в 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 ответа:
Вам потребуется реализовать 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
Вот хороший путеводитель, которому вы можете следовать. https://guides.codepath.com/android/Using-Parcelableif (savedInstanceState != null) { mArtists = savedInstanceState.getParcelableArrayList(ARTISTS);
Есть 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); }