【问题标题】:android: how do I change a field in an array of JSONObject when a button is clicked?android:单击按钮时如何更改 JSONObject 数组中的字段?
【发布时间】:2017-01-30 15:57:44
【问题描述】:

我有一个ListView,它包含服务器中JSONObject 数组中的项目。在每个项目中,我都有一个按钮。我想在单击按钮的位置更新一个字段。我该怎么做呢?

我有这个 json 文件:

[ { “notif_id”:1, "Event": "试玩活动 1", "start_date": "/Date(1485277800000)/", "end_date": "/日期(1485294900000)/", “反馈”:0 }, { “notif_id”:2, "事件": "试玩事件 2", "start_date": "/Date(1485376200000)/", "end_date": "/日期(1485385500000)/", “反馈”:0 }, { “notif_id”:3, "事件": "试玩事件 3", "start_date": "/Date(1485534000000)/", "end_date": "/日期(1485543300000)/", “反馈”:0 } ]

更新

这是我从 JSON 文件中获取字段值的地方..

//looping events
                for(int i=0; i < events.length(); i++){
                     JSONObject e = events.getJSONObject(i);

                    // String notif= e.getString("notif_id");
                        String Event = e.getString("Event");
                        //start_date parsing
                        String start_date= e.getString("start_date");
                        start_date= start_date.replace("/Date(", "").replace(")/", "");
                        long start_time= Long.parseLong(start_date);
                        Date startdate= new Date(start_time);
                        temp_start = new SimpleDateFormat("dd/MM/yyyy").format(startdate).toString();
                        start_date= temp_start; 

                        //end_date parsing
                        String end_date = e.getString("end_date");
                        end_date= end_date.replace("/Date(", "").replace(")/", "");
                        long end_time= Long.parseLong(end_date);
                        Date enddate= new Date(end_time);
                        temp_end = new SimpleDateFormat("dd/MM/yyyy").format(enddate).toString();
                        end_date= temp_end;

                     // tmp hash map for single event
                        HashMap<String, String> eventtemp = new HashMap<String, String>();

                     // adding each child node to HashMap key => value
                        eventtemp.put("Event", Event);
                        eventtemp.put("start_date", start_date); 
                        eventtemp.put("end_date", end_date);
                       // eventtemp.put("notif_id", notif);

                     // adding event to event list
                       feedList.add(eventtemp); 
                } 

这就是我将它们放入 Listview 项的方式:

  ListAdapter adapter = new SimpleAdapter(
                    HomeActivity.this, feedList,
                    R.layout.list_item, new String[]{"Event" , "start_date",
                    "end_date"}, new int[]{R.id.event,
                    R.id.start_date, R.id.end_date});

            listview.setAdapter(adapter);
     }

我想更改单击按钮的相应事件的反馈。 有人可以帮忙吗?非常感谢。

【问题讨论】:

  • 你想在服务器上更新它?
  • 是的,我想在服务器中更新。
  • 您需要一个网络服务来向服务器发送新数据...您有吗?
  • 我的 json 文件位于单独的环境 (VS) 中。当我将我的网络应用程序链接到我的 android 应用程序时。我通过 HttpHandler 连接到我的 json 文件的位置。

标签: android json


【解决方案1】:

假设您将该 JSON 文件存储在名为 data 的字符串中。

final JSONArray jsonArray = new JSONArray(data);   // convert data (String) to JSONArray

// On button clicked, change the value
firstButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Get first item from jsonArray
            // For secondButton and thirdButton, adjust the index
            JSONObject jsonObject = jsonArray.getJSONObject(0);
            jsonObject.put("notif_id", 1);
            jsonObject.put("Event", "Trial Event 1 Success");
            jsonObject.put("feedback", 1);
            jsonArray.put(0, jsonObject);
        }
    });

并且不要忘记用 try/catch 包围来处理 JSONException。

编辑 - 1

如果你使用 ListView,在它的适配器类中,你应该有一个方法叫做: getView(final int position, View view, ViewGroup viewGroup)。 然后,您可以在此方法中更新 JSON 字符串:

holder.btUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            JSONObject jsonObject = jsonArray.getJSONObject(position);
            jsonObject.put("notif_id", 1);
            jsonObject.put("Event", "Trial Event 1 Success");
            jsonObject.put("feedback", 1);
            jsonArray.put(position, jsonObject);
        }
    });

编辑 - 2

好的,您的主要问题似乎不是如何在单击按钮时更新 JSON 值,而是如何访问 ListView 中的按钮,以便您可以根据在列表的指定位置单击的按钮更新 JSON 值(我说得对吗? ?)。

然后,您应该重写getView 方法,并使其简单(因此您不需要为您的 ListView 创建单独的适配器类),您可以这样做:

ListAdapter adapter = new SimpleAdapter(HomeActivity.this, feedList,
    R.layout.list_item, new String[]{"Event", "start_date", "end_date"},
    new int[]{R.id.event, R.id.start_date, R.id.end_date}) {
        @Override
        public View getView (final int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);

            Button btUpdate = (Button) view.findViewById(R.id.button_id);
            btUpdate.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        // data is String type you stored your JSON file
                        JSONArray jsonArray = new JSONArray(data);
                        JSONObject jsonObject = jsonArray.getJSONObject(position);
                        jsonObject.put("notif_id", 1);
                        jsonObject.put("Event", "Trial Event 1 Success");
                        jsonObject.put("feedback", 1);
                        jsonArray.put(position, jsonObject);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });

            return view;
        }
    };

我的资源:@​​987654321@

【讨论】:

  • 感谢您的回复珍妮丝。但我想同时获得点击按钮的索引。就像如果我点击第一个它会修改第一个,但是如果我点击第二个,它会修改第二个,依此类推。在我的 xml 文件中,只有一个按钮和代表该字段的文本视图。它们正在 Listview 中使用。
  • 我的 JSONObject 数组与按钮一起显示在 Listview 中。 @JaniceKartika
  • 好的@Nnana我已经编辑了答案。但是使用这种方法,您应该将 JSON 字符串传递给适配器,否则您应该创建一个接口。
  • 它似乎无法正常工作。我的 LogCat 中有此错误消息:java.lang.NullPointerException
  • 那个错误太笼统了,请更新您的问题并发布适配器类+活动/片段类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2021-01-20
  • 1970-01-01
  • 2019-12-15
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多