遇到问题的列表视图状态恢复 [英] Having trouble restoring state on listview

查看:262
本文介绍了遇到问题的列表视图状态恢复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,允许用户选择一个选项,并显示在ListView一定的清单。我在与得到它的保存和恢复状态的问题。我有被取决于哪个选项,用户选择设置list_mode。到目前为止,我已经把它保存在适配器的状态,但恢复它造成的问题(我知道它的节能,因为当我检查在OnCreate它显示的基础上选择正确的项目customAdapter.onRestoreInstanceState(savedInstanceState),但我有一个很难使其恢复到列表视图,它会崩溃的恢复。这在崩溃和getAllItems.clear .addAll我有甚至很难codeD此的名单之一,但它也不能工作。当我发表评论该行出来,然后它崩溃的主要活动。我是当它涉及到Java和Android和我仍然在学习一个小白,我不知道我怎么关闭或关闭多远我。任何人都可以对我有什么洞察做错了,我怎么能得到它的工作?谢谢

表适配器:

 公共类ListAdapter延伸BaseAdapter {
私有静态最后弦乐KEY_ADAPTER_STATE =ListAdapter.KEY_ADAPTER_STATE;
公共枚举的listmode {
    IMAGES_AND_TEXT,
    IMAGES_ONLY,
    TEXT_ONLY
}私人的listmode mListMode = ListMode.IMAGES_AND_TEXT;私人的ArrayList<项目> mItems;私人的ArrayList<项目> mImages;私人的ArrayList<项目> mTexts;@覆盖
公众诠释的getCount(){
    开关(mListMode){
        案例IMAGES_AND_TEXT:
            返回mItems == NULL? 0:mItems.size();
        案例IMAGES_ONLY:
            返回mImages == NULL? 0:mImages.size();
        案例TEXT_ONLY:
            返回mTexts == NULL? 0:mTexts.size();
    }
    返回0;
}@覆盖
公共项目的getItem(INT位置){
    开关(mListMode){
        案例IMAGES_AND_TEXT:
            返回mItems == NULL?空:mItems.get(位置);
        案例IMAGES_ONLY:
            返回mImages == NULL?空:mImages.get(位置);
        案例TEXT_ONLY:
            返回mTexts == NULL?空:mTexts.get(位置);    }
    返回null;
}
公众的ArrayList getAllItems(){
    开关(mListMode){
        案例IMAGES_AND_TEXT:
            返回mItems;
        案例IMAGES_ONLY:
            返回mImages;
        案例TEXT_ONLY:
            返回mTexts;    }
    返回null;
}@覆盖
众长getItemId(INT位置){
    返回的位置; //没有真正使用
}@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){    视图V = NULL;
    TextView的TN = NULL;
    ImageView的IMG = NULL;    如果(convertView == NULL){
        LayoutInflater六;
        VI = LayoutInflater.from(parent.getContext());
        V = vi.inflate(R.layout.list,NULL);
    }其他{
        V = convertView;
    }    项目P =的getItem(位置);
    TN =(TextView中)v.findViewById(R.id.tvText);
    IMG =(ImageView的)v.findViewById(R.id.thumbnail);
    如果(p.getmType()。等于(图像)){
        img.setVisibility(View.VISIBLE);
        Picasso.with(parent.getContext()).load(p.getmData()).error((R.drawable.placeholder_error)).placeholder(R.drawable.placeholder).resize(90,0).into(img);
        tn.setText(ID:+ p.getmID()+\\ n-型:+ p.getmType()+\\ nDate:+ p.getmDate()+\\ nImage网址:+ p.getmData( ));
    }其他{
        img.setVisibility(View.GONE);
        tn.setText(ID:+ p.getmID()+\\ n类型:​​+ p.getmType()+\\ nDate:+ p.getmDate()+\\ n文字的数据:+ p.getmData( ));
    }
    返回伏;
}
公共无效setListMode(列表模式列表模式){
    mListMode =的listmode;
    notifyDataSetChanged();
}公共无效setItems(JSONArray JSONArray),其中抛出JSONException {    mItems =新的ArrayList<>();
    mImages =新的ArrayList<>();
    mTexts =新的ArrayList<>();
    的for(int i = 0; I< jsonArray.length();我++){
        项目项目=新的项目((JSONObject的)jsonArray.get(一));
        mItems.add(项目);
        如果(item.getmType()。等于(图像)){
            mImages.add(项目);
        }
        如果(item.getmType()。等于(文本)){
            mTexts.add(项目);
        }
    }    notifyDataSetChanged();
}
公共无效的onSaveInstanceState(捆绑savedInstanceState){
    savedInstanceState.putParcelableArrayList(list_items,getAllItems());
}公共无效onRestoreInstanceState(捆绑savedInstanceState){
    如果(savedInstanceState.containsKey(list_items)){
        // ArrayList的<项目>对象= savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
        // getAllItems()清()。
        //getAllItems().addAll(objects);
        //mImages.clear();
        //mImages.addAll(objects);
    }
}

}

主要活动:

  myListView =(ListView控件)findViewById(R.id.listViewID);
    customAdapter =新ListAdapter();
    如果(savedInstanceState!= NULL){
        //当我把一个断点,在这里我看到它得到正确的列表
        customAdapter.onRestoreInstanceState(savedInstanceState);
    }    如果(savedInstanceState = NULL&放大器;!&安培; savedInstanceState.containsKey(list_items)){
        //当我删除.clear和.addAll它然后崩溃在这一行
        myListView.onRestoreInstanceState(savedInstanceState.getParcelable(list_items));
        myListView.setAdapter(customAdapter);
    }
    其他{
        如果(isNetworkAvailable()){
            的getData theJsonData =新的getData();
            theJsonData.execute();
        }
        其他{
            Toast.makeText(getApplicationContext(),没有网络连接,Toast.LENGTH_SHORT).show();
            tvNoInet.setVisibility(View.VISIBLE);
        }
    }
@覆盖
公共无效的onSaveInstanceState(捆绑savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    //不知道我应该把这里如果我有什么是正确的
   customAdapter.onSaveInstanceState(savedInstanceState);}
//这是code,它设置list_mode当用户选择一个选项
如果(ID == R.id.all){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
        myListView.setSelectionAfterHeaderView();
        返回true;    }
    如果(ID == R.id.images){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
        myListView.setSelectionAfterHeaderView();
        返回true;    }
    如果(ID == R.id.text){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
        myListView.setSelectionAfterHeaderView();
        返回true;
    }

和我的Item类:

 公共类项目实现Parcelable {
私人字符串MID;
私人字符串MTYPE;
私人字符串mDate;
私人字符串MDATA;公共项目(字符串MID,MTYPE字符串,字符串mDate,字符串MDATA){
    this.mType = MTYPE;
    this.mID = MID;
    this.mDate = mDate;
    this.mData = MDATA;
}
公共项目(JSONObject的jsonItem)抛出JSONException {
    字符串的itemid = NULL;
    字符串ITEMTYPE = NULL;
    字符串itemDate = NULL;
    字符串的ItemData = NULL;    如果(jsonItem.has(ID)){
        ITEMID = jsonItem.getString(ID);
    }
    如果(jsonItem.has(类型)){
        ITEMTYPE = jsonItem.getString(类型);
    }
    如果(jsonItem.has(DATE)){
        itemDate = jsonItem.getString(日期);
    }
    如果(jsonItem.has(数据)){
        的ItemData = jsonItem.getString(数据);
    }
    this.mID = ITEMID;
    this.mType = ITEMTYPE;
    this.mDate = itemDate;
    this.mData =的ItemData;
}
保护项目(宗地中){
    的String []数据=新的String [4];
    in.readStringArray(数据);
    this.mID =数据[0];
    this.mType =数据[1];
    this.mDate =数据[2];
    this.mData =数据[3];}公共静态最后的造物主<项目> CREATOR =新的创造者和LT;项目>(){
    @覆盖
    公共项目createFromParcel(包裹中){
        返回新的项目(在);
    }    @覆盖
    公共项目[] newArray(INT大小){
        返回新产品【规格】;
    }
};公共字符串getmID(){
    返回MID;
}公共字符串getmType(){
    返回MTYPE;
}公共字符串getmDate(){
    返回mDate;
}公共字符串getmData(){
    返回MDATA;
}@覆盖
公共字符串的toString(){
    返回{+
            ID ='+ MID +'\\''+
            类型='+ M型+'\\''+
            日期='+ mDate +'\\''+
            数据='+ MDATA +'\\''+
            };
}@覆盖
公众诠释describeContents(){
    返回0;
}@覆盖
公共无效writeToParcel(DEST包裹,INT标志){    的String []数据=新的String [4];
    数据[0] =中;
    数据[1] = MTYPE;
    数据[2] = mDate;
    数据[3] = MDATA;
    dest.writeStringArray(数据);
}
}

UPDATE:这是code样子了。当我选择一个特定的列表,然后旋转它的工作画面。它停留在当前选定的名单上。现在的问题是,当他们选择一个新的列表中的设备旋转后ListView控件是完全空白

 如果(savedInstanceState!= NULL){
        customAdapter.onRestoreInstanceState(savedInstanceState);        如果(savedInstanceState.containsKey(KEY_LIST_VIEW_STATE)){
            myListView.onRestoreInstanceState(savedInstanceState.getParcelable(KEY_LIST_VIEW_STATE));
            myListView.setAdapter(customAdapter);
        }    }    其他{
        如果(isNetworkAvailable()){
            的getData theJsonData =新的getData();
            theJsonData.execute();
            tvNoInet.setVisibility(View.GONE);
            btnRetry.setVisibility(View.GONE);
        }其他{
            Toast.makeText(getApplicationContext(),没有网络连接,Toast.LENGTH_SHORT).show();
            tvNoInet.setVisibility(View.VISIBLE);
            btnRetry.setVisibility(View.VISIBLE);
        }
    }@覆盖
公共无效的onSaveInstanceState(捆绑savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    customAdapter.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putParcelable(KEY_LIST_VIEW_STATE,myListView.onSaveInstanceState());
}

和我的更新列表适配器:

 私人的listmode mListMode = ListMode.IMAGES_AND_TEXT;私人的ArrayList<项目> mItems =新的ArrayList<>();私人的ArrayList<项目> mImages =新的ArrayList<>();私人的ArrayList<项目> mTexts =新的ArrayList<>();   公共无效的onSaveInstanceState(捆绑savedInstanceState){
    //savedInstanceState.putParcelableArrayList(\"list_items,getAllItems());
    savedInstanceState.putParcelableArrayList(KEY_ADAPTER_STATE,getAllItems());
}公共无效onRestoreInstanceState(捆绑savedInstanceState){
    如果(savedInstanceState.containsKey(KEY_ADAPTER_STATE)){
        ArrayList的<项目>对象= savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
        getAllItems()清()。
        。getAllItems()的addAll(对象);
        //mImages.clear();
        //mImages.addAll(objects);
    }
}

这是在切换列表中的选项菜单中的code。如果我没有旋转屏幕还没有工作的。当我旋转屏幕,并选择不同的列表列表视图随后空白。如果我选择全部,这应该会显示所有项目那么无论列表我以前如果恢复的所选。所以,如果我只在第一次选择的图像,旋转屏幕的一切是正确的显示出来,如果​​我旋转屏幕背部和Only或图片只有再次选择文本,该列表为空,如果我选择全部那么无论列表我拿起第一显示时间(仅在这种情况下,图像)

 如果(ID == R.id.all){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
        myListView.setSelectionAfterHeaderView();
        返回true;    }
    如果(ID == R.id.images){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
        myListView.setSelectionAfterHeaderView();
        返回true;    }
    如果(ID == R.id.text){
        item.setChecked(真);
        customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
        myListView.setSelectionAfterHeaderView();
        返回true;
    }


解决方案

好吧,既然我把你进入这个烂摊子....:)

我的东西在这样的情况下做的是在保存的实例状态捆绑来传递给构造函数适配器。既然你做了项目 Parcelable ,一切应该很容易。

 公共ListAdapter(捆绑savedInstanceState){        如果(savedInstanceState!= NULL){            INT序= savedInstanceState.getInt(adapter_mode,0);
            mListMode = ListMode.values​​()[序];            ArrayList的<项目>项目=
                    savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
            如果(项目!= NULL){
                setItems(项目);
            }
        }
    }
    公共无效的onSaveInstanceState(捆绑outState){
        outState.putInt(adapter_mode,mListMode.ordinal());
        outState.putParcelableArrayList(KEY_ADAPTER_STATE,mItems);
    }

因此​​,与在构造函数保存实例的状态,你并不需要一个明确的方法来恢复适配器的状态。

 公共无效setItems(JSONArray JSONArray),其中抛出JSONException {        清单<项目>项目=新的ArrayList<>();
        的for(int i = 0; I< jsonArray.length();我++){
            items.add(新项目((JSONObject的)jsonArray.get(I)));
        }
        setItems(项目);
    }    私人无效setItems(列表<项目>项目){        对于(项目项目:项目){
            mItems.add(项目);
            如果(item.getmType()。等于(图像)){
                mImages.add(项目);
            }
            如果(item.getmType()。等于(文本)){
                mTexts.add(项目);
            }
        }        notifyDataSetChanged();
     }

I have an app that allows the user to select an option and a certain list is displayed in a listview. I'm having issues with getting it to save and restore state. I have a list_mode that gets set depending on which option the user selects. so far I have it saving the state of the adapter but restoring it is causing an issue ( I know it's saving because when I examine customAdapter.onRestoreInstanceState(savedInstanceState) in the onCreate it's showing the right items based on selection but I'm having a hard time restoring it to the list view. It will crash on restore. It crashes on getAllItems.clear and .addAll. I have even hard coded this to one of the lists but it didn't work either. When I comment that line out then it crashes in the main activity. I'm a noob when it comes to Java and Android and am still learning. I do not know how close or how far off I am. Can anyone provide insight on what I'm doing wrong and how I can get it to work? Thanks

List Adapter:

public class ListAdapter extends BaseAdapter {
private static final String KEY_ADAPTER_STATE = "ListAdapter.KEY_ADAPTER_STATE";
public enum ListMode {
    IMAGES_AND_TEXT,
    IMAGES_ONLY,
    TEXT_ONLY
}

private ListMode mListMode = ListMode.IMAGES_AND_TEXT;

private ArrayList<Item> mItems;

private ArrayList<Item> mImages;

private ArrayList<Item> mTexts;

@Override
public int getCount() {
    switch (mListMode) {
        case IMAGES_AND_TEXT:
            return mItems == null ? 0 : mItems.size();
        case IMAGES_ONLY:
            return mImages == null ? 0 : mImages.size();
        case TEXT_ONLY:
            return mTexts == null ? 0 : mTexts.size();
    }
    return 0;
}

@Override
public Item getItem(int position) {
    switch (mListMode) {
        case IMAGES_AND_TEXT:
            return mItems == null ? null : mItems.get(position);
        case IMAGES_ONLY:
            return mImages == null ? null : mImages.get(position);
        case TEXT_ONLY:
            return mTexts == null ? null : mTexts.get(position);

    }
    return null;
}
public ArrayList getAllItems() {
    switch (mListMode) {
        case IMAGES_AND_TEXT:
            return mItems;
        case IMAGES_ONLY:
            return mImages;
        case TEXT_ONLY:
            return  mTexts;

    }
    return null;
}

@Override
public long getItemId(int position) {
    return position;    // not really used
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = null;
    TextView tn = null;
    ImageView img = null;

    if (convertView == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(parent.getContext());
        v = vi.inflate(R.layout.list, null);
    } else {
        v=convertView;
    }

    Item p = getItem(position);
    tn = (TextView) v.findViewById(R.id.tvText);
    img = (ImageView) v.findViewById(R.id.thumbnail);
    if (p.getmType().equals("image")) {
        img.setVisibility(View.VISIBLE);
        Picasso.with(parent.getContext()).load(p.getmData()).error((R.drawable.placeholder_error)).placeholder(R.drawable.placeholder).resize(90,0).into(img);
        tn.setText("ID: " + p.getmID()+"\nTYPE: " + p.getmType() +"\nDate: " + p.getmDate()+ "\nImage URL: " +  p.getmData());
    } else {
        img.setVisibility(View.GONE);
        tn.setText("ID: " + p.getmID()+"\nTYPE: " + p.getmType() +"\nDate: " + p.getmDate()+ "\nText Data: " +  p.getmData());
    }
    return v;
}


public void setListMode(ListMode listMode) {
    mListMode = listMode;
    notifyDataSetChanged();
}

public void setItems(JSONArray jsonArray) throws JSONException {

    mItems = new ArrayList<>();
    mImages = new ArrayList<>();
    mTexts = new ArrayList<>();
    for (int i = 0; i < jsonArray.length(); i++) {
        Item item = new Item((JSONObject) jsonArray.get(i));
        mItems.add(item);
        if (item.getmType().equals("image")) {
            mImages.add(item);
        }
        if (item.getmType().equals("text")) {
            mTexts.add(item);
        }
    }

    notifyDataSetChanged();
}
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putParcelableArrayList("list_items", getAllItems());
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState.containsKey("list_items")) {
        //ArrayList<Item> objects = savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
        //getAllItems().clear();
        //getAllItems().addAll(objects);
        //mImages.clear();
        //mImages.addAll(objects);
    }
}

}

Main Activity:

myListView = (ListView) findViewById(R.id.listViewID);
    customAdapter = new ListAdapter();
    if(savedInstanceState!=null) {
        //When I put a breakpoint here I see it's getting the correct list
        customAdapter.onRestoreInstanceState(savedInstanceState);
    }

    if (savedInstanceState != null && savedInstanceState.containsKey("list_items")) {
        //When I remove the .clear and .addAll it then crashes on this line
        myListView.onRestoreInstanceState(savedInstanceState.getParcelable("list_items"));
        myListView.setAdapter(customAdapter);
    }
    else{
        if (isNetworkAvailable()) {
            getData theJsonData = new getData();
            theJsonData.execute();
        }
        else{
            Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_SHORT).show();
            tvNoInet.setVisibility(View.VISIBLE);
        }
    }
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    //Not sure what I should put here or if what I have is right
   customAdapter.onSaveInstanceState(savedInstanceState);

}
//This is the code that sets the list_mode when the user selects an option
if (id == R.id.all) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
        myListView.setSelectionAfterHeaderView();
        return true;

    }
    if (id == R.id.images) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
        myListView.setSelectionAfterHeaderView();
        return true;

    }
    if (id == R.id.text) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
        myListView.setSelectionAfterHeaderView();
        return true;
    }

And my Item class:

public class Item implements Parcelable{
private String mID;
private String mType;
private String mDate;
private String mData;

public Item(String mID,String mType, String mDate, String mData)  {
    this.mType = mType;
    this.mID = mID;
    this.mDate = mDate;
    this.mData = mData;
}
public Item(JSONObject jsonItem) throws JSONException {
    String itemID=null;
    String itemType=null;
    String itemDate=null;
    String itemData=null;

    if (jsonItem.has("id")) {
        itemID=jsonItem.getString("id");
    }
    if (jsonItem.has("type")) {
        itemType=jsonItem.getString("type");
    }
    if (jsonItem.has("date")){
        itemDate=jsonItem.getString("date");
    }
    if (jsonItem.has("data")){
        itemData=jsonItem.getString("data");
    }
    this.mID=itemID;
    this.mType=itemType;
    this.mDate=itemDate;
    this.mData=itemData;
}


protected Item(Parcel in) {
    String[] data = new String[4];
    in.readStringArray(data);
    this.mID = data[0];
    this.mType = data[1];
    this.mDate = data[2];
    this.mData = data[3];

}

public static final Creator<Item> CREATOR = new Creator<Item>() {
    @Override
    public Item createFromParcel(Parcel in) {
        return new Item(in);
    }

    @Override
    public Item[] newArray(int size) {
        return new Item[size];
    }
};

public String getmID() {
    return mID;
}

public String getmType() {
    return mType;
}

public String getmDate() {
    return mDate;
}

public String getmData() {
    return mData;
}

@Override
public String toString() {
    return "{" +
            "ID='" + mID + '\'' +
            ", Type='" + mType + '\'' +
            ", Date='" + mDate + '\'' +
            ", Data='" + mData + '\'' +
            '}';
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {

    String[] data = new String[4];
    data[0] = mID;
    data[1] = mType;
    data[2] = mDate;
    data[3] = mData;
    dest.writeStringArray(data);
}
}

UPDATE: This is what the code looks like now. When I select a certain list and then rotate the screen it's working. It's staying on the currently selected list. Now the issue is when they select a new list after the device has been rotated the listview is completely blank

if(savedInstanceState!=null) {
        customAdapter.onRestoreInstanceState(savedInstanceState);

        if (savedInstanceState.containsKey(KEY_LIST_VIEW_STATE)) {
            myListView.onRestoreInstanceState(savedInstanceState.getParcelable(KEY_LIST_VIEW_STATE));
            myListView.setAdapter(customAdapter);
        }

    }

    else{
        if (isNetworkAvailable()) {
            getData theJsonData = new getData();
            theJsonData.execute();
            tvNoInet.setVisibility(View.GONE);
            btnRetry.setVisibility(View.GONE);
        } else {
            Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_SHORT).show();
            tvNoInet.setVisibility(View.VISIBLE);
            btnRetry.setVisibility(View.VISIBLE);
        }
    }

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    customAdapter.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putParcelable(KEY_LIST_VIEW_STATE, myListView.onSaveInstanceState());


}

and my updated list adapter:

 private ListMode mListMode = ListMode.IMAGES_AND_TEXT;

private ArrayList<Item> mItems= new ArrayList<>();

private ArrayList<Item> mImages= new ArrayList<>();

private ArrayList<Item> mTexts= new ArrayList<>();

   public void onSaveInstanceState(Bundle savedInstanceState) {
    //savedInstanceState.putParcelableArrayList("list_items", getAllItems());
    savedInstanceState.putParcelableArrayList(KEY_ADAPTER_STATE, getAllItems());
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState.containsKey(KEY_ADAPTER_STATE)) {
        ArrayList<Item> objects = savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
        getAllItems().clear();
        getAllItems().addAll(objects);
        //mImages.clear();
        //mImages.addAll(objects);
    }
}

And this is the code in the options menu that switches the list. If I haven't rotated the screen yet this works. When I rotate the screen and select a different list the listview is then blank. If I select "All" which should display All items then whatever list I had selected before if restored. So If I selected Images Only at first, rotate the screen everything is displayed right, if I rotate the screen back and select Text Only or Images Only again, the list is blank, if I select "All" then whatever list I picked the first time (in this case Images Only) is displayed

if (id == R.id.all) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
        myListView.setSelectionAfterHeaderView();
        return true;

    }
    if (id == R.id.images) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
        myListView.setSelectionAfterHeaderView();
        return true;

    }
    if (id == R.id.text) {
        item.setChecked(true);
        customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
        myListView.setSelectionAfterHeaderView();
        return true;
    }

解决方案

Well, since I got you into this mess.... :)

Something I do in situations like this is to pass in the saved instance state Bundle to the constructor for the adapter. Since you made your Item class Parcelable, everything else should be easy.

    public ListAdapter(Bundle savedInstanceState) {

        if (savedInstanceState != null) {

            int ordinal = savedInstanceState.getInt("adapter_mode", 0);
            mListMode = ListMode.values()[ordinal];

            ArrayList<Item> items = 
                    savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
            if (items != null) {
                setItems(items);
            }
        }
    }


    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("adapter_mode", mListMode.ordinal());
        outState.putParcelableArrayList(KEY_ADAPTER_STATE, mItems);
    }

So with the saved instance state in the constructor, you don't need an explicit method to restore the adapter state.

    public void setItems(JSONArray jsonArray) throws JSONException {

        List<Item> items = new ArrayList<>();
        for (int i = 0; i < jsonArray.length(); i++) {
            items.add(new Item((JSONObject) jsonArray.get(i)));
        }
        setItems(items);
    }

    private void setItems(List<Item> items) {

        for (Item item : items) {
            mItems.add(item);
            if (item.getmType().equals("image")) {
                mImages.add(item);
            }
            if (item.getmType().equals("text")) {
                mTexts.add(item);
            }
        }

        notifyDataSetChanged();
     }

这篇关于遇到问题的列表视图状态恢复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆