簡體   English   中英

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課程:

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 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();
}

並修改您的模型類:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM