0

我有一个执行一些网络操作的自定义视图。根据该操作结果,视图构建 UI。

该视图包含通过 Internet 获取的卡片列表。此视图在多个地方使用。可以说其中之一是我的片段。

这是我在片段内部所做的:

class MyFragment extends Fragment  {
    // same as findViewById
    @BindView(R.id.card_list) CardHelper cardHelper;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // init my element with some data before it initializes
        cardHelper.init(data);
    }
}

这是我的自定义视图的样子:

public class CardHelper extends ListView { 

   // some info that is built from internet data
   private List<HashMap<String, String>> cardElements = new ArrayList<>();

    public void init(Data data) {
        // does async network and then build a view based on results
        // Network operations could depend on data param
    }
}

好的,现在当用户从我的应用程序切换到另一个应用程序时,我的 Fragment 可能会被破坏。我想保存我的自定义视图的状态。因此我的观点不需要再次从互联网上获取信息。所以我附加CardHelper了以下数据(基于这个答案):

public class CardHelper extends ListView { 
   // some info that is built from internet data
   private List<HashMap<String, String>> cardElements = new ArrayList<>();

    public void init(Data data) {
        // does async network and then build a view based on results
    }

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.cardElements = this.cardElements;
        return ss;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if(state instanceof SavedState) {
            SavedState ss = (SavedState)state;
            super.onRestoreInstanceState(ss.getSuperState());
            this.cardElements = ss.cardElements;
        } else {
            super.onRestoreInstanceState(state);
        }
    }

    private static class SavedState extends BaseSavedState {
        private List<HashMap<String, String>> cardElements = new ArrayList<>();

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            this.cardElements = new ArrayList<>();
            in.readList(this.cardElements, null);
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeList(this.cardElements);
        }

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

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

为了争论,我想从这个视图本身保存视图的数据。因此片段/活动或 w/e 使用它不需要知道它在内部是如何工作的。如果我从多个地方使用它,我就不需要复制存储\恢复此视图的代码。

好的,现在解决问题

当 CardHelper 第一次创建时,我init使用一些data. 当我的片段被破坏并且应用程序进入后台然后恢复时,方法将按以下优先级执行:

  1. SavedState:私人SavedState(包裹在){
  2. SavedState: public void writeToParcel(Parcel out, int flags) {
  3. CardHelper:公共无效初始化(数据数据){
  4. CardHelper: public void onRestoreInstanceState(Parcelable state) {

如您所见onRestoreInstanceState,仅在onActivityCreated. 但是我需要知道我是否应该在init此之前在方法中执行网络操作。所以我想先onRestoreInstanceState被执行,然后才被执行init。但是在Fragments LifeCycle中没有可以在此之后完成的方法。

如何重新格式化我的代码,以便在调用onRestoreInstanceStateon后可以在我的片段中调用某些操作CardHelper?还有一个在创建onRestoreInstanceState时不会第一次调用的东西。CardHelper但在这种情况下,我也需要初始化我的 CardHelper。

4

1 回答 1

1

简单的修复应该是在布局init()之后发布步骤,因此已经被调用。为此,您只需执行以下操作:cardHelperonRestoreInstanceStateinit()post(...)

cardHelper.post(new Runnable() {
                   public void run() {
                       cardHelper.init();
                   }
               });

没测试过,估计能用。

于 2017-02-18T11:19:41.043 回答