시리즈의 데이터를 저장하고 복원해야합니다. 당신은 당신이 어떻게하는지 완전히 자유 롭습니다. 예를 들어 다음과 같이 할 수 있습니다.
시리즈의 모든 데이터를 검토하여 x 값 하나, y 값 하나를 float 목록으로 저장하십시오. 하나의 문제는 GraphView 4.0.0 이전 버전에서 시리즈의 내부 데이터 배열이 보호되어 액세스 할 수 없다는 것입니다. 한 가지 방법은이를 변경하기 위해 재정의하는 것이며, 다른 방법은 데이터를 자체 배열에 캐시에 저장하는 것입니다.
방법 # 1 : 은 GraphViewSeries 서브 클래스를 생성하고 데이터 배열 공개하기를 오버라이드 (override) :
class DataVisibleGraphViewSeries extends GraphViewSeries {
public GraphViewDataInterface[] getValues() {
return values;
}
// expose constructor 1
public GraphViewSeries(GraphViewDataInterface[] values) {
super(values);
}
// expose constructor 2
public GraphViewSeries(String description, GraphViewSeriesStyle style, GraphViewDataInterface[] values) {
super(description, style, values);
}
}
// no use this class DataVisibleGraphViewSeries to create series
방법 # 2 : 는 값의 복사본을 저장하는 전용 멤버를 작성합니다. Series 객체를 만들 때 멤버에 데이터를 저장합니다.
GraphView 4.0.0 이전 버전에서는 GraphView 개체로부터 시리즈 개체를 가져올 방법이 없습니다. 그래서 유일한 방법은 내 시리즈를 개인 회원 (예 : mSeries)에도 저장하는 것입니다.
다음 단계는 상태를 저장하는 것입니다. 저장 상태 :
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
View view = getView();
GraphView graphView = (GraphView) view.getTag(ParentActivity.GRAPH_VIEW_TAG);
// if you have chosen way #1 and you have your series object stored in a member "mSeries" then you can access the data like that
GraphViewDataInterface[] data = mSeries.getValues();
double[] xValues = new double[data.size()];
double[] yValues = new double[data.size()];
for (int i=0; i<data.size(); i++) {
xValues[i] = data.get(i).getX();
yValues[i] = data.get(i).getY();
}
// save it
outState.putDoubleArray("xValues", xValues);
outState.putDoubleArray("yValues", yValues);
}
가 다시 번들에서 데이터를 얻을 시리즈를 재설정해야 할 데이터를 복원 할 수 있습니다.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ... create your views and your mSeries member must be initialized here
if (savedInstanceState != null && savedInstanceState.getDoubleArray("xValues") != null) {
double[] xValues = savedInstanceState.getDoubleArray("xValues");
double[] yValues = savedInstanceState.getDoubleArray("yValues");
// create data array
GraphViewDataInterface[] data = new GraphViewDataInterface[xValues.length];
for (int i=0;i<xValues.length;i++) {
data[i] = new GraphViewData(xValues[i], yValues[i]);
}
mSeries.resetData(data);
}
}
나는 그 코드를 테스트 한 적이 없으며 어쩌면 구문/맞춤법 오류가있을 수 있지만 적어도 지금은 그것을 관리하는 방법을 알고 있어야합니다. 이것은 하나의 시리즈를 위해 작동하지만 당신은
조나스을 ... 당신의 일련의 번호를 저장 등 xValues0, xValues1, xValues2와 같은 이름을 통과, 이상 작동
건배 이를 확장 할 수 있습니다 제안에 감사드립니다. 불행히도 가로 및 세로 모드를위한 별도의 레이아웃이 있습니다. UI 스레드로 펌핑하기 전에 실시간으로 제공되는 일부 데이터를 처리해야하므로 AyncTasks를 사용해야합니다. –
그러면 고통의 세계에 빠지게 될 것입니다. 두 가지 옵션 - 활동 레크 리 에이션을 유지할 수 있습니다. 이 경우 위에 언급 한 것처럼 onSaveInstanceState에 모든 UI 데이터를 저장해야하며, 연결된 활동이 이미있는 경우 UI를 업데이트하지 않도록 AsyncTasks의 onPostExecute를 매우 조심해야합니다 의해 파괴됨. 이미 페 데드 된 데이터를 다시 페치하기 위해 네트워크로 되돌려 보내지 않은 요청을 네트워크에 다시 보내지 않도록하려면 로더 패턴을 구현해야하며 불필요한 페치를 방지하기 위해 이러한 작업을 실행하는 데주의해야합니다. –
다른 옵션은 자동 활동 레크리에이션을 해제하는 것입니다. 이는 onConfigChange에서 컨텐츠 뷰를 수동으로 다시로드 한 다음 모든 요소의 UI 상태를 현재 요소와 동일하게 업데이트해야 함을 의미합니다. 하지만 AsyncTasks는 문제가 없으므로 불필요한 가져 오기에 대해 걱정할 필요가 없습니다. –