代码之家  ›  专栏  ›  技术社区  ›  crushman

MPAndroidChart内截击onResponse

  •  0
  • crushman  · 技术社区  · 7 年前

    早上好, 我已经努力解决这个问题好几天了。我试图获取一些json数据,并将其作为MPandroidChart库的饼图条目。如果我将该库放入onCreate方法中并手动提供输入,而不进行截击,那么该库的工作将非常完美,如下所示:

    pie_entry.add(new PieEntry(5, "test"));

    但是,当我把它放在volley的onResponse方法中,或者如果我尝试获取条目并将其发送到另一个方法,然后将其添加到pieChart,或者如果我尝试将条目添加到全局veriable,然后添加到图表中,那么它就不起作用了。这是我的代码:

    String tag_String_reg = "reg_GetVoteResults";

        db = new SQLiteHandler(getApplicationContext());
        final HashMap<String, Object> myData;
        myData = db.getUserIDAndOrg();
        int userID = (int) myData.get(db.KEY_USER_ID);
        final String mOrg = (String) myData.get(db.KEY_USER_UID);
    
        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                AppConfig.URL_GET_VOTERESULTS, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray JArray = new JSONArray(response);
                    for (int i = 0; i < JArray.length(); i++) {
                        JSONObject answerInfo = JArray.getJSONObject(i);
                        String answer = answerInfo.getString("answer");
                        float vote = answerInfo.getInt("answer_vote");
                        //vote_count = new ArrayList<>();
                        //anslist = new ArrayList<>();
                        //vote_count.add(vote);
                        //anslist.add(answer);
                        pie_entry.add(new PieEntry(vote, answer));
                    }
                    pie_entry.add(new PieEntry(5, "test"));
                    pie_entry.add(new PieEntry(7, "test2"));
                    Log.wtf("current name and int ", pie_entry.toString());
                    //testing(pie_entry);
                    //Log.wtf("final result: ", pe.toString());
                    pieChart.setUsePercentValues(true);
                    //Log.wtf("inside chart ", pe.toString());
                    pieChart.getDescription().setEnabled(false);
                    pieChart.setExtraOffsets(5, 10, 5, 5);
                    pieChart.setDragDecelerationFrictionCoef(0.95f);
                    pieChart.setDrawHoleEnabled(true);
                    pieChart.setHoleColor(WHITE);
                    pieChart.setTransparentCircleRadius(61f);
    
                    PieDataSet dataSet = new PieDataSet(pie_entry, "Voting Results");
                    dataSet.setSliceSpace(3f);
                    dataSet.setSelectionShift(5f);
                    dataSet.setColors(ColorTemplate.JOYFUL_COLORS);
    
                    PieData data = new PieData((dataSet));
                    data.setValueTextSize(10f);
                    data.setValueTextColor(Color.YELLOW);
    
                    pieChart.setData(data);
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Didnt work. Catch. "+ response.toString(), Toast.LENGTH_LONG).show();
                    Log.d(TAG, "Didnt work. Error : "+e.toString());
    
                }
    
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if(error.getMessage()==null){
                            Toast.makeText(getApplicationContext(), " ERROR ", Toast.LENGTH_LONG).show();
                        }else{
                            Toast.makeText(getApplicationContext(), "Error. Please check your internet connection. ErrorListener. " + error.getMessage(), Toast.LENGTH_LONG).show();
    
    
                        }
    
                    }
                }){
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("org_id", mOrg);
                params.put("question_id", question_id);
                return params;
            }
        };
        AppController.getInstance().addToRequestQueue(stringRequest, tag_String_reg);`
    

    我确信json响应在我用 Log.wtf 任何帮助都将不胜感激。

    此外,logcat中没有错误,它只会显示我的日志结果。wtf:

    current name and int: [Entry, x: 0.0 y: 1.0, Entry, x: 0.0 y: 1.0, Entry, x: 0.0 y: 5.0, Entry, x: 0.0 y: 7.0]
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Jerome    7 年前

    你忘了吗

    pieChart.invalidate();
    

    之后

    pieChart.setData(data);
    

    要强制刷新图表?

        2
  •  0
  •   Umar Hussain    7 年前

    将这些添加到后面 pieChart.setData(data) :

    pieChart.notifyDataSetChanged();
    pieChart.invalidate();
    

    您需要向图表视图通知基础数据的更改,就像我们对 RecyclerView.Adapter 当其数据更改时。