【问题标题】:Android: fill a spinner data from the server dynamicallyAndroid:从服务器动态填充微调器数据
【发布时间】:2019-11-06 01:26:26
【问题描述】:

我是安卓新手。如何动态地从服务器数据中填充微调器。

所以我正在尝试将数据从服务器填充到我的微调器。我的 JSON 是

{"topic": "/waypoints", "msg": {"waypoints": [{"header": {"stamp": {"secs": 0, "nsecs": 0}, "frame_id": "map", "seq": 0}, "pose": {"position": {"y": -140.901899144836, "x": 44.36469369653882, "z": 0.0}, "orientation": {"y": 0.0, "x": 0.0, "z": 0.5062775131960053, "w": 0.8623706161692133}}, "name": "A"}, {"header": {"stamp": {"secs": 0, "nsecs": 0}, "frame_id": "map", "seq": 0}, "pose": {"position": {"y": -102.30524463734227, "x": 51.282396271771304, "z": 0.0}, "orientation": {"y": 0.0, "x": 0.0, "z": 0.6926372547579506, "w": 0.721286096719859}}, "name": "B"}]}, "op": "publish"}

现在我试图只获取“名称”: A 和 B ,当我选择它们中的每一个时,就会有方向和位置的信息。 提前致谢!

编辑

所以基本上这是我的航点的弹出窗口。我正在努力为我的方法部分修复“(String json)”。

public class Pop extends Activity {

private SubscribedData<WaypointList> waypointlistData;
private RosbridgeListener rosbridge;
Spinner spin;
String json;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.popup);

    /** an ID for the spinner **/
    spin = (Spinner) findViewById(R.id.spinner);

    /** publisher definition with its type of message**/
    waypointlistData = new SubscribedData<>();
    final Type waypointlistType = new TypeToken<SubscribedData<WaypointList>>() {
    }.getType();


    /** A method to parse a jsonstring to waypoint list **/
    private List<Waypoint> getWayPointListFromJsonString(String json){
        List<Waypoint> wayPoints = new ArrayList<>();
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONArray wayPointJsonArray = jsonObject.getJSONObject("msg").getJSONArray("waypoints");
            for (int i = 0; i < wayPointJsonArray.length(); i++) {
                JSONObject wayPointJsonObject = wayPointJsonArray.getJSONObject(i);
                // Parse name
                String name = wayPointJsonObject.getString("name");

                // Parse pose to get position and orientation;
                JSONObject poseJsonObject = wayPointJsonObject.getJSONObject("pose");

                // Parse position form pose
                JSONObject positionJsonObject = poseJsonObject.getJSONObject("position");
                Position position = new Position();
                position.x = positionJsonObject.getFloat("x");
                position.y = positionJsonObject.getFloat("y");
                position.z = positionJsonObject.getFloat("z");

                // Parse orientation from pose.
                JSONObject orientationJsonObject = poseJsonObject.getJSONObject("orientation");
                Orientation orientation = new Orientation();
                orientation.x = orientationJsonObject.getFloat("x");
                orientation.y = orientationJsonObject.getFloat("y");
                orientation.z = orientationJsonObject.getFloat("z");
                orientation.w = orientationJsonObject.getFloat("w");

                Pose pose = new Pose();
                pose.position = position;
                pose.orientation = orientation;

                Waypoint wayPoint = new Waypoint();
                wayPoint.name = name;
                wayPoint.pose = pose;
                wayPoints.add(wayPoint);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return wayPoints;
    }

    // This is the json string returned from server.
    String jsonString = "{\"topic\": \"/waypoints\", \"msg\": {\"waypoints\": [{\"header\": {\"stamp\": {\"secs\": 0, \"nsecs\": 0}, \"frame_id\": \"map\", \"seq\": 0}, \"pose\": {\"position\": {\"y\": -140.901899144836, \"x\": 44.36469369653882, \"z\": 0.0}, \"orientation\": {\"y\": 0.0, \"x\": 0.0, \"z\": 0.5062775131960053, \"w\": 0.8623706161692133}}, \"name\": \"A\"}, {\"header\": {\"stamp\": {\"secs\": 0, \"nsecs\": 0}, \"frame_id\": \"map\", \"seq\": 0}, \"pose\": {\"position\": {\"y\": -102.30524463734227, \"x\": 51.282396271771304, \"z\": 0.0}, \"orientation\": {\"y\": 0.0, \"x\": 0.0, \"z\": 0.6926372547579506, \"w\": 0.721286096719859}}, \"name\": \"B\"}]}, \"op\": \"publish\"}";

    // This will convert the json string to list of WayPoint
    List<Waypoint> wayPoints = getWayPointListFromJsonString(jsonString);

    // Create adapter for spinner
    SpinnerAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, wayPoints);

    spin.setAdapter(adapter);
    spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int p, long id) {
            Waypoint wayPoint = (Waypoint) parent.getItemAtPosition(p);

            // Process position here
            Position position = wayPoint.pose.position;

            // Process orientation here
            Orientation orientation = wayPoint.pose.orientation;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

        /** a set of the waypoints popup window **/
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;
        int height = dm.heightPixels;

        getWindow().setLayout((int) (width * .6), (int) (height * .6));


}

}

【问题讨论】:

  • 要完成您的任务,还有很多工作要做。首先,您需要打开与服务器的连接以从服务器获取数据(在本例中为 JSON 字符串)。其次,您必须编写代码来将 JSON 字符串解析为模型类。最后,将其填充到微调器中。
  • @NhấtGiang 是的,我能够从服务器获取数据。我已经完成了数据的序列化。我只是无法将它们显示给我的微调器。
  • 所以你有一个JSON字符串,你需要在微调器上显示,对吗?
  • @NhấtGiang 正确
  • 我明白了,吃完午饭我会帮你的=))

标签: java android spinner


【解决方案1】:

微调器中的每个项目都表示一个“航点”。所以第一步是为 WayPoint 创建模型类。

class WayPoint {
    String name;
    Pose pose;

    @NonNull
    @Override
    public String toString() {
        return name;
    }
}

class Pose {
    Position position;
    Orientation orientation;
}

class Position {
    double x, y, z;
}

class Orientation {
    double x, y, z, w;
}

二、写一个方法解析一个json字符串到路点列表

private List<WayPoint> getWayPointListFromJsonString(String json) {
    List<WayPoint> wayPoints = new ArrayList<>();

    try {
        JSONObject jsonObject = new JSONObject(json);
        JSONArray wayPointJsonArray = jsonObject.getJSONObject("msg").getJSONArray("waypoints");
        for (int i = 0; i < wayPointJsonArray.length(); i++) {
            JSONObject wayPointJsonObject = wayPointJsonArray.getJSONObject(i);

            // Parse name
            String name = wayPointJsonObject.getString("name");

            // Parse pose to get position and orientation;
            JSONObject poseJsonObject = wayPointJsonObject.getJSONObject("pose");

            // Parse position form pose
            JSONObject positionJsonObject = poseJsonObject.getJSONObject("position");
            Position position = new Position();
            position.x = positionJsonObject.getDouble("x");
            position.y = positionJsonObject.getDouble("y");
            position.z = positionJsonObject.getDouble("z");

            // Parse orientation from pose.
            JSONObject orientationJsonObject = poseJsonObject.getJSONObject("orientation");
            Orientation orientation = new Orientation();
            orientation.x = orientationJsonObject.getDouble("x");
            orientation.y = orientationJsonObject.getDouble("y");
            orientation.z = orientationJsonObject.getDouble("z");
            orientation.w = orientationJsonObject.getDouble("w");

            Pose pose = new Pose();
            pose.position = position;
            pose.orientation = orientation;

            WayPoint wayPoint = new WayPoint();
            wayPoint.name = name;
            wayPoint.pose = pose;
            wayPoints.add(wayPoint);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return wayPoints;
}

最后将它们放入 MainActivity 类中。

public class MainActivity extends AppCompatActivity {

    private Spinner wayPointSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wayPointSpinner = findViewById(R.id.spinner_way_point);

        // This is the json string returned from server.
        String jsonString = "{\"topic\": \"/waypoints\", \"msg\": {\"waypoints\": [{\"header\": {\"stamp\": {\"secs\": 0, \"nsecs\": 0}, \"frame_id\": \"map\", \"seq\": 0}, \"pose\": {\"position\": {\"y\": -140.901899144836, \"x\": 44.36469369653882, \"z\": 0.0}, \"orientation\": {\"y\": 0.0, \"x\": 0.0, \"z\": 0.5062775131960053, \"w\": 0.8623706161692133}}, \"name\": \"A\"}, {\"header\": {\"stamp\": {\"secs\": 0, \"nsecs\": 0}, \"frame_id\": \"map\", \"seq\": 0}, \"pose\": {\"position\": {\"y\": -102.30524463734227, \"x\": 51.282396271771304, \"z\": 0.0}, \"orientation\": {\"y\": 0.0, \"x\": 0.0, \"z\": 0.6926372547579506, \"w\": 0.721286096719859}}, \"name\": \"B\"}]}, \"op\": \"publish\"}";

        // This will convert the json string to list of WayPoint
        List<WayPoint> wayPoints = getWayPointListFromJsonString(jsonString);

        // Create adapter for spinner
        SpinnerAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, wayPoints);

        wayPointSpinner.setAdapter(adapter);
        wayPointSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int p, long id) {
                WayPoint wayPoint = (WayPoint) parent.getItemAtPosition(p);

                // Process position here
                Position position = wayPoint.pose.position;

                // Process orientation here
                Orientation orientation = wayPoint.pose.orientation;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    您首先需要反序列化数据并映射到模型类,然后将模型列表设置为微调器适配器。检查改造以请求和解析您的 Jason 响应。

    【讨论】:

      【解决方案3】:
       for (int i = 0; i < arrResult.length(); i++) {
           arr_akun[i] = "string dynamically";
       }
      
       ArrayAdapter<String> adapter_akun = new ArrayAdapter<>(context, R.layout.spinner_akun_item, arr_akun);
       spinner.setAdapter(adapter_akun);
      
       spinner_akun.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
              @Override
              public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
           // do something to get name
              }
      
              @Override
              public void onNothingSelected(AdapterView<?> parent) {
              }
          });
      

      【讨论】:

      • 嗨!感谢您提供示例代码。但是你能解释一下这个代码,比如“arrResult”,“arr_akun”,就像我说的那样,我还是个初学者。谢谢!
      • @yenbico arrresult 是来自 json 对象的数组。例如:结果:[{A,B,C,D}]。 arr_akun 是字符串数组。 JSONArray arrResult = new JSONArray(result); String[] arr_akun = new String[arrResult.length()];
      猜你喜欢
      • 2013-04-01
      • 2011-01-12
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2017-04-24
      相关资源
      最近更新 更多