1

私は現在、Bluetooth経由で複数のセンサー値を読み取り、それらをグラフに表示するためのAndroidアプリを開発しています。jjoe64 の GraphViewLibrary に出くわしたとき、これが私の目的に完全に適合することがわかりました。しかし今、私はちょっと立ち往生しています。基本的に、3 つのセンサーの値を 3 つの異なるグラフで生成して表示する小さな関数を作成しました。これは、アクティビティが最初に開始されたときに問題なく機能し、3 つのグラフすべてが適切にレンダリングおよび表示されます。しかし、resetData() メソッドを使用して異なる値でグラフを更新し、各グラフに新しい値をレンダリングする場合、3 つのグラフのうち最後のグラフのみが更新されます。明らかに、これはこのかなり単純な関数を使用して生成された最後のグラフだからです。私の質問は:3 つのグラフすべてを次々に生成および更新するために、私のような関数を使用する他のエレガントな方法はありますか? 私はすでに GraphView 変数を null に戻し、ビューの削除と追加のさまざまな組み合わせを設定しようとしました。関数にgraphView1、graphView2などの個々のGraphView変数を渡すことも機能しません。

関数は次のとおりです。

 private GraphView graphView;
 private GraphViewSeries graphViewSerie;
 private Boolean graphExisting = false;

...

public void makeGraphs (float[] valueArray, String heading, int graphId) {     
   String graphNumber = "graph"+graphId;
   int resId = getResources().getIdentifier(graphNumber,"id", getPackageName());
   LinearLayout layout = (LinearLayout) findViewById(resId);  

   int numElements = valueArray.length;
   GraphViewData[] data = new GraphViewData[numElements];       
   for (int c = 0; c<numElements; c++) {
       data[c] = new GraphViewData(c+1, valueArray[c]);
       Log.i(tag, "GraphView Graph"+graphId+": ["+(c+1)+"] ["+valueArray[c]+"].");
   }

   if (!graphExisting) {
       // init temperature series data            
       graphView = new LineGraphView(  
             this // context  
             , heading // heading  
       );    
       graphViewSerie = new GraphViewSeries(data);
       graphView.addSeries(graphViewSerie); 
       ((LineGraphView) graphView).setDrawBackground(true);       
       graphView.getGraphViewStyle().setNumHorizontalLabels(numElements); 
       graphView.getGraphViewStyle().setNumVerticalLabels(5);
       graphView.getGraphViewStyle().setTextSize(10);   
       layout.addView(graphView);
   }
   else {
       //graphViewSerie = new GraphViewSeries(data);
       //graphViewSerie.resetData(data);
        graphViewSerie.resetData(new GraphViewData[] {
                new GraphViewData(1, 1.2f)
                , new GraphViewData(2, 1.4f)
                , new GraphViewData(2.5, 1.5f) // another frequency
                , new GraphViewData(3, 1.7f)
                , new GraphViewData(4, 1.3f)
                , new GraphViewData(5, 1.0f)
                });

  }

そして、これは以前に生成された配列に依存する関数呼び出しです (正しい値で埋められるように監視されています):

makeGraphs(graphData[0], "TempHistory", 1);
makeGraphs(graphData[1], "AirHistory", 2);
makeGraphs(graphData[2], "SensHistory", 3);
graphExisting = true;

一般的なヘルプおよび/またはフィードバックは大歓迎です! よろしくお願いします!


編集/更新: jjoe64 の回答のおかげで、機能を適切に動作するように変更することができました。私は自分の関数を追加のパラメーターとして処理するGraphViewSeriesオブジェクトも変更すると思っていたので、明らかに私の考えに誤りがありました(以前に試しました)。もちろん、これは機能しません。ただし、このマイナーな改善により、Graphviewseries 配列を使用してこれを機能させることができました。同様の問題に苦しんでいる人々に、私が何を変更しなければならなかったかについてのアイデアを提供するために、ここにソリューションの簡単なドラフトを示します。

私はちょうど変更しました

private GraphViewSeries graphViewSerie;

private GraphViewSeries graphViewSerie[] = new GraphViewSeries[3]; 

次のように、関数 (if 句) 内で既に指定されているパラメーター graphId を使用して、適切なシリーズにアクセスします。

int graphIndex = graphId - 1;
graphViewSerie[graphIndex] = new GraphViewSeries(data);

else節では、同様に呼び出してシリーズを更新しています

graphViewSerie[graphIndex].resetData(data);

jjoe64 さん、ご支援いただきありがとうございます。質問を以前に更新できなかったのは残念ですが、時間がありませんでした。

4

1 に答える 1