如何在Android中创建可分配的对象列表?

Dim*_*los 4 android parcelable

所以我有一个应用程序,通过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;
    }
Run Code Online (Sandbox Code Playgroud)

所以我认为我必须使艺术家列表可以使用,然后将其传递给onSaveInstanceState方法.但是如何让这个名单变得可以哄骗?

非常感谢,我希望这不会太混乱......

sud*_*wan 7

您需要为Artist Data Model类实现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];
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

在你的片段中 - 如果你有List mArtists,那么你保存并检索列表

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

在onCreateView中

if (savedInstanceState != null) {
        mArtists = savedInstanceState.getParcelableArrayList(ARTISTS);
Run Code Online (Sandbox Code Playgroud)

这是一个很好的指南,你可以遵循. https://guides.codepath.com/android/Using-Parcelable

还有一个名为Android Parcelable Code Generator的IDE插件,它可以为您生成所有的样板代码.

还有一个名为Parceler的库,非常方便.它完全删除了样板.