【问题标题】:JSON to ListView in Android with Gson使用 Gson 在 Android 中 JSON 到 ListView
【发布时间】:2013-05-21 18:24:46
【问题描述】:

我正在尝试将 json 结果放入我的 Android 应用程序的 ListView 中。

这是我的 Json:

[
    {
        "Result": "8:30,21",
        "Meeting": "Antwerp Olympics",
        "Event": "3000m",
        "Date": "30/05/2013"
    },
    {
        "Result": "008,32",
        "Meeting": "Antwerp Olympics",
        "Event": "Long Jump",
        "Date": "30/05/2013"
    },
    {
        "Result": "6,35",
        "Meeting": "Antwerp Olympics",
        "Event": "High Jump",
        "Date": "30/05/2013"
    },
    {
        "Result": "5,00",
        "Meeting": "Antwerp Olympics",
        "Event": "Discus Throw",
        "Date": "30/05/2013"
    }
]

这是我的安卓代码

Gson gson = new Gson();
Result[] res = gson.fromJson(results, Result[].class);
ListView lv1 = (ListView) getView().findViewById(R.id.sampleListView);
String[] values = new String[] { }; //values
ArrayAdapter<String> files = new ArrayAdapter<String>(getActivity(),android.R.layout.list_content, values);
lv1.setAdapter(files);

使用 GSON 获得 json 结果是可行的,我用一个简单的 json 做到了。现在我不知道如何在我的列表视图中实现这个 JSON 结果。我应该如何填充 String[] 值?

提前致谢

【问题讨论】:

标签: android json listview android-listview gson


【解决方案1】:

创建一个名为 EventEntity 的类或您的选择

import com.google.gson.annotations.SerializedName;

public class EventEntity{

    @SerializedName("Result")
    public int Result;

    @SerializedName("Meeting")
    public String Meeting;

    @SerializedName("Event")
    public String Event;

    @SerializedName("Date")
    public String Date;

    public EventEntity()
    {}
}

并将列表视图数据绑定代码更改为此

ListView lv1 = (ListView) getView().findViewById(R.id.sampleListView);
Gson gson = new Gson();
List<EventEntity> events = (List<EventEntity>) gson.fromJson(results, new TypeToken<EventEntity>>() {}.getType());
ArrayAdapter<EventEntity> files = new ArrayAdapter<EventEntity>(..........);
lv1.setAdapter(files);

编辑, 您应该创建一个自定义适配器类和一个行布局

public class MyCustomAdapter extends ArrayAdapter<EventEntity> {

  private final List<EventEntity> list;
  private final Activity context;

  public MyCustomAdapter (Activity context, List<EventEntity> list) {
    super(context, R.layout.rowlayout, list);
    this.context = context;
    this.list = list;
  }

  static class ViewHolder {
    protected TextView eventTitle;
    protected TextView eventDate;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;

      LayoutInflater inflator = context.getLayoutInflater();
      view = inflator.inflate(R.layout.rowlayout, null);
      final ViewHolder viewHolder = new ViewHolder();
      viewHolder.eventTitle = (TextView) view.findViewById(R.id.label);
      viewHolder.eventDate = (TextView) view.findViewById(R.id.date);

      view.setTag(viewHolder);

     ViewHolder holder = (ViewHolder) view.getTag();
     holder.eventTitle.setText(list.get(position).Event);
     holder.eventDate.setText(list.get(position).Date);

     return view;
} 

【讨论】:

  • 我有一个名为“Result”的“EventEntity”类,我正在实现你的代码。我会告诉你的
  • 感谢您的回答。我的应用程序现在显示填充的列表视图。但这还不正确。它显示例如:Result@321cd11.. 我该怎么办?添加一个toString?或调整 List values = (List) gson.fromJson(results, new TypeToken>() {}.getType()); ArrayAdapter files = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1, values);
  • @AndrejHefner 如果您遇到问题请告诉我
  • @AndrejHefner 好的更高级的适配器来正确列出项目数据我会更新我的答案。你应该制作你的自定义适配器
  • @AndrejHefner 我用自定义适配器类示例更新了我的答案。不要忘记在您的布局文件夹上创建一个行布局
【解决方案2】:

您可以在 ArrayAdapter 中使用自己的类。赞ArrayAdapter&lt;Result[]&gt;

我建议你使用扩展ArrayAdapter&lt;Result[]&gt;的类

并覆盖getView() 方法。

getView() 方法中使用此方法:http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder(您不必这样做,但为了获得更好的性能。)

【讨论】:

    【解决方案3】:

    这是一个示例,我调用一个 web 服务并返回一个对象列表的结果。然后我解析 JSON 对象并将它们放入哈希图项列表中。第二个代码片段是我将 hashmap 项列表键入到实际列表视图的地方。它对列表视图项使用自定义布局。

    List> values = new ArrayList>();
    结果 = clsGlobals.PerformGetFromWeb(appcontext, client);

                    if (result != "")
                    {
                        try
                        {                               
                            JSONArray menuItems = new JSONArray(result);
    
                            for (int i = 0; i < menuItems.length(); i++)
                            {
                                HashMap<String, String> map = new HashMap<String, String>();
                                JSONObject jsonObject = menuItems.getJSONObject(i);
    
                                map.put("MenuItemID", jsonObject.getString("MenuItemID"));
                                map.put("MenuItemName", jsonObject.getString("MenuItemName"));
                                map.put("MenuItemDesc", jsonObject.getString("MenuItemDesc"));                      
                                map.put("Calories", jsonObject.getString("Calories"));
                                map.put("Protein", jsonObject.getString("Protein"));                    
                                map.put("Fat", jsonObject.getString("Fat"));                        
                                map.put("Carbohydrates", jsonObject.getString("Carbohydrates"));
                                map.put("Sodium", jsonObject.getString("Sodium"));
                                map.put("FranchiseID", jsonObject.getString("FranchiseID"));
    
                                values.add(map);
                            }
    
                            Log.d(clsGlobals.AppName, "Location menu items retrieved successfully!");
                        }
    
    
            if (values.size() > 0)
            {               
    
                //ArrayAdapter<String> adapter = new ArrayAdapter<String>(MyAppDateActivity.this, R.layout.listitemlayout, values);
    
                String[] colsNames = new String[] {"MenuItemName", "MenuItemDesc"};
                int[] resItemsToAssign = new int[] {R.id.lstName, R.id.lstDesc};
    
    
                SimpleAdapter sa = new SimpleAdapter(appContext, values, R.layout.listitemlayout,   colsNames, resItemsToAssign );
    
                listViewMenu.setAdapter(sa);
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多