Json 在 Android 中向 RecyclerView 发送文本
Json text to RecyclerView in Android
我的 RecyclerView 需要帮助。我的 SQL 数据库中有一个 atring 数组,如下所示:
{"success":true,"0":{"order_number":"078","typ_first":"E3rft","typ_last":"Split","order_date_time":"2016-10-11 19:20:03"},"1":{"order_number":"166","typ_first":"E483f","typ_last":"Split_test","order_date_time":"2016-10-12 18:39:30"}}
在我的 RecyclerView 中,我有以下字段:
order_number
typ_all
(输入第一个和最后一个)
date
(只有日期没有时间)
这就是我获取字符串数组的方式:
String plansData = plansPreferenceData.getString("plansPreferenceData", "");
这是我将数据设置到 RecyclerView 的方式:
// Set plan data
Plans plan = new Plans("123", "E3rft Split", "11.10.2016");
// Add Object to list
planList.add(plan);
// Notify data changes
pAdapter.notifyDataSetChanged();
我的Plans
class:
public class Plans {
private String planTitle, planType, planDate;
public Plans(String planTitle, String planType, String planDate) {
this.planTitle = planTitle;
this.planType = planType;
this.planDate = planDate;
}
public void setPlanTitle(String planTitle) {
this.planTitle = planTitle;
}
public String getPlanTitle() {
return planTitle;
}
public void setPlanType(String planType) {
this.planType = planType;
}
public String getPlanType() {
return planType;
}
public void setPlanDate(String planDate) {
this.planDate = planDate;
}
public String getPlanDate() {
return planDate;
}
}
我的onCreateView
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_training, container, false);
preparePlansData();
return view;
}
我的preparePlansData()
:
private void preparePlansData() {
// Set plan data
Plans plan = new Plans("123", "fkfjfjeje", "21.04.1977");
// Add Object to list
planList.add(plan);
plan = new Plans("test", "tttt", "22.01.2017");
planList.add(plan);
// Notify data changes
pAdapter.notifyDataSetChanged();
}
我的问题是如何将信息从字符串数组中提取到我的适配器中?我还需要在添加之前格式化日期。感谢您的帮助!
在此处阅读有关 Gson 的信息:
http://guides.codepath.com/android/leveraging-the-gson-library
之后你将能够像这样编写代码:
Type type = new TypeToken<Map<Integer, Plans>>(){}.getType();
Map<Integer, Plans> myMap = gson.fromJson("your json from db", type);
并在你的适配器中使用这个 map.values()
你的 Plans
class 应该是这样的:
class Plans {
String order_number;
String typ_first;
String typ_last;
String order_date_time;
}
如果您想要其他字段名称,则必须使用 @SerializedName
注释
最后,你应该写这样的东西,(我不知道语法是不是100%没有IDE现在打开):
private void preparePlansData() {
String plansData = plansPreferenceData.getString("plansPreferenceData", "");
Type type = new TypeToken<Map<Integer, Plans>>(){}.getType();
Map<Integer, Plans> myMap = gson.fromJson(plansData, type);
planList.addAll(myMap.values());
// Notify data changes
pAdapter.notifyDataSetChanged();
}
并修改您的模型 class:
public class Plans {
@SerializedName("order_number")
String planTitle;
@SerializedName("typ_last")
String planType;
@SerializedName("order_date_time")
String planDate;
....
希望对你有所帮助
检查此代码(您可以删除@Test 注释):
class Plans {
String typ_firstString;
String typ_last;
String order_date_time;
public Plans(String typ_firstString, String typ_last, String order_date_time) {
this.typ_firstString = typ_firstString;
this.typ_last = typ_last;
this.order_date_time = order_date_time;
}
}
class PlansResponse {
boolean status;
List<Plans> plans;
}
@Test
public void testPlacesResponseDeserializer() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(PlansResponse.class, new PlansResponseDeserializer())
.create();
String jsonString = "{\"success\":true,\"0\":{\"order_number\":\"078\",\"typ_first\":\"E3rft\",\"typ_last\":\"Split\",\"order_date_time\":\"2016-10-11 19:20:03\"},\"1\":{\"order_number\":\"166\",\"typ_first\":\"E483f\",\"typ_last\":\"Split_test\",\"order_date_time\":\"2016-10-12 18:39:30\"}}";
PlansResponse plansResponse = gson.fromJson(jsonString, PlansResponse.class);
assert plansResponse.status == true;
assert plansResponse.plans.size() == 2;
}
class PlansResponseDeserializer implements JsonDeserializer<PlansResponse> {
private String getElementAsString(JsonObject jsonObject, String key) {
JsonElement element = jsonObject.get(key);
return element.getAsString();
}
@Override
public PlansResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
PlansResponse plansResponse = new PlansResponse();
List<Plans> plansList = new ArrayList<>();
Gson gson = new Gson();
Type type = new TypeToken<Map<String, JsonObject>>(){}.getType();
Map<String, JsonElement> map = gson.fromJson(json, type);
for(Map.Entry<String, JsonElement> entry : map.entrySet()) {
String key = entry.getKey();
if("success".equals(key)) {
JsonPrimitive jsonPrimitive = (JsonPrimitive) entry.getValue();
plansResponse.status = jsonPrimitive.getAsBoolean();
continue;
}
JsonObject jsonObject = (JsonObject)entry.getValue();
String typ_firstString = getElementAsString(jsonObject, "typ_first");
String typ_last = getElementAsString(jsonObject, "typ_last");
String order_date_time = getElementAsString(jsonObject, "order_date_time");
plansList.add(new Plans(typ_firstString, typ_last, order_date_time));
}
plansResponse.plans = plansList;
return plansResponse;
}
}
我的 RecyclerView 需要帮助。我的 SQL 数据库中有一个 atring 数组,如下所示:
{"success":true,"0":{"order_number":"078","typ_first":"E3rft","typ_last":"Split","order_date_time":"2016-10-11 19:20:03"},"1":{"order_number":"166","typ_first":"E483f","typ_last":"Split_test","order_date_time":"2016-10-12 18:39:30"}}
在我的 RecyclerView 中,我有以下字段:
order_number
typ_all
(输入第一个和最后一个)date
(只有日期没有时间)
这就是我获取字符串数组的方式:
String plansData = plansPreferenceData.getString("plansPreferenceData", "");
这是我将数据设置到 RecyclerView 的方式:
// Set plan data
Plans plan = new Plans("123", "E3rft Split", "11.10.2016");
// Add Object to list
planList.add(plan);
// Notify data changes
pAdapter.notifyDataSetChanged();
我的Plans
class:
public class Plans {
private String planTitle, planType, planDate;
public Plans(String planTitle, String planType, String planDate) {
this.planTitle = planTitle;
this.planType = planType;
this.planDate = planDate;
}
public void setPlanTitle(String planTitle) {
this.planTitle = planTitle;
}
public String getPlanTitle() {
return planTitle;
}
public void setPlanType(String planType) {
this.planType = planType;
}
public String getPlanType() {
return planType;
}
public void setPlanDate(String planDate) {
this.planDate = planDate;
}
public String getPlanDate() {
return planDate;
}
}
我的onCreateView
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_training, container, false);
preparePlansData();
return view;
}
我的preparePlansData()
:
private void preparePlansData() {
// Set plan data
Plans plan = new Plans("123", "fkfjfjeje", "21.04.1977");
// Add Object to list
planList.add(plan);
plan = new Plans("test", "tttt", "22.01.2017");
planList.add(plan);
// Notify data changes
pAdapter.notifyDataSetChanged();
}
我的问题是如何将信息从字符串数组中提取到我的适配器中?我还需要在添加之前格式化日期。感谢您的帮助!
在此处阅读有关 Gson 的信息:
http://guides.codepath.com/android/leveraging-the-gson-library
之后你将能够像这样编写代码:
Type type = new TypeToken<Map<Integer, Plans>>(){}.getType();
Map<Integer, Plans> myMap = gson.fromJson("your json from db", type);
并在你的适配器中使用这个 map.values()
你的 Plans
class 应该是这样的:
class Plans {
String order_number;
String typ_first;
String typ_last;
String order_date_time;
}
如果您想要其他字段名称,则必须使用 @SerializedName
注释
最后,你应该写这样的东西,(我不知道语法是不是100%没有IDE现在打开):
private void preparePlansData() {
String plansData = plansPreferenceData.getString("plansPreferenceData", "");
Type type = new TypeToken<Map<Integer, Plans>>(){}.getType();
Map<Integer, Plans> myMap = gson.fromJson(plansData, type);
planList.addAll(myMap.values());
// Notify data changes
pAdapter.notifyDataSetChanged();
}
并修改您的模型 class:
public class Plans {
@SerializedName("order_number")
String planTitle;
@SerializedName("typ_last")
String planType;
@SerializedName("order_date_time")
String planDate;
....
希望对你有所帮助
检查此代码(您可以删除@Test 注释):
class Plans {
String typ_firstString;
String typ_last;
String order_date_time;
public Plans(String typ_firstString, String typ_last, String order_date_time) {
this.typ_firstString = typ_firstString;
this.typ_last = typ_last;
this.order_date_time = order_date_time;
}
}
class PlansResponse {
boolean status;
List<Plans> plans;
}
@Test
public void testPlacesResponseDeserializer() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(PlansResponse.class, new PlansResponseDeserializer())
.create();
String jsonString = "{\"success\":true,\"0\":{\"order_number\":\"078\",\"typ_first\":\"E3rft\",\"typ_last\":\"Split\",\"order_date_time\":\"2016-10-11 19:20:03\"},\"1\":{\"order_number\":\"166\",\"typ_first\":\"E483f\",\"typ_last\":\"Split_test\",\"order_date_time\":\"2016-10-12 18:39:30\"}}";
PlansResponse plansResponse = gson.fromJson(jsonString, PlansResponse.class);
assert plansResponse.status == true;
assert plansResponse.plans.size() == 2;
}
class PlansResponseDeserializer implements JsonDeserializer<PlansResponse> {
private String getElementAsString(JsonObject jsonObject, String key) {
JsonElement element = jsonObject.get(key);
return element.getAsString();
}
@Override
public PlansResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
PlansResponse plansResponse = new PlansResponse();
List<Plans> plansList = new ArrayList<>();
Gson gson = new Gson();
Type type = new TypeToken<Map<String, JsonObject>>(){}.getType();
Map<String, JsonElement> map = gson.fromJson(json, type);
for(Map.Entry<String, JsonElement> entry : map.entrySet()) {
String key = entry.getKey();
if("success".equals(key)) {
JsonPrimitive jsonPrimitive = (JsonPrimitive) entry.getValue();
plansResponse.status = jsonPrimitive.getAsBoolean();
continue;
}
JsonObject jsonObject = (JsonObject)entry.getValue();
String typ_firstString = getElementAsString(jsonObject, "typ_first");
String typ_last = getElementAsString(jsonObject, "typ_last");
String order_date_time = getElementAsString(jsonObject, "order_date_time");
plansList.add(new Plans(typ_firstString, typ_last, order_date_time));
}
plansResponse.plans = plansList;
return plansResponse;
}
}