【发布时间】: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 正确
-
我明白了,吃完午饭我会帮你的=))