使用ArrayList循环出JSON数组

时间:2017-08-28 21:51:55

标签: android json for-loop arraylist retrofit2

我正在尝试学习改造,我已成功尝试发布数据,现在我正在尝试检索JSON数组,如下所示:

{
  "result": "success",
  "message": "All Questions Have Been Selected",
  "question": {
      "all_question_ids": ["1","2","3"]
  }
}

我正在使用以下getter

public ArrayList getAll_question_ids(){
     return all_question_ids;
  }

我正在使用Retrofit检索如下

if (resp.getResult().equals(Constants.SUCCESS)) {

                SharedPreferences.Editor editor = pref.edit();

                Log.d("Question_IDs", "getAllQuestionID() = " + response.body().getQuestion().getAll_question_ids() );

                editor.putString(Constants.All_QUESTION_IDS,((resp.getQuestion().getAll_question_ids().toString())));
                editor.apply();

            }
            progress.setVisibility(View.INVISIBLE);

我在这里被卡住了,因为我正在检索数组,但我不确定如何循环播放现在存储在共享首选项中的数组。

当我放一个祝酒词来告诉我ID是如何遇到的时候,我的吐司确认数据为[1,2,3]

目标是每次循环迭代时添加一个动态按钮和个人ID,即按钮1,按钮2等。

我尝试了以下内容:

String questionNumber = pref.getString(Constants.All_QUESTION_IDS, "");

 for (int i =0; i < questionNumber.length(); i++) {


            try {

        /*Dynamically create new Button which includes the question name
          */

                AppCompatButton btn_question = new AppCompatButton(getActivity());

        /*LayoutParams (int width, int height,float weight)
        As LayoutParams is defaulted in px, I have called a method called dpToPX to make sure
        the dynamically added EditText is the same size on all devices.
         */
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dpToPx(280), dpToPx(45), 1);
                btn_question.setBackgroundColor(Color.parseColor("#3B5998"));
                btn_question.setTextColor(Color.WHITE);
               // btn_question.setText(String.valueOf(x));
                btn_question.setText("Question "+ pref.getString(Constants.All_QUESTION_IDS,""));
                btn_question.setGravity(Gravity.CENTER);
                //generate unique ID for each new EditText dynamically created
                View.generateViewId();

                //Log.d("TEST VALUE", "Question1 generated ID = " + btn_question.generateViewId());


                params.setMargins(0, dpToPx(10), 0, dpToPx(10));
                btn_question.setPadding(0, 0, 0, 0);
                btn_question.setLayoutParams(params);
                allEds.add(btn_question);
                mLayout.addView(btn_question);


            } catch (Exception e) {
                Log.d(TAG, "Failed to create new edit text");
            }
        }

然而,上面是添加数组中出现的值,例如[1,2,3],这显然不是我想要的。

我添加了一张照片,以防我的解释不明确。我希望每次循环迭代时都会添加一个带有1个数字的按钮,但我无法解决这个问题。

我查看过很多资源,但找不到与我的问题相关的答案,但如果有的话,我不太熟悉,无法识别类似的问题。

如果有人可以提供一些帮助,我将不胜感激!

enter image description here

2 个答案:

答案 0 :(得分:1)

这是保存然后读出List个项目(在本例中为String个实例)的问题。

您已选择使用值editor.putString()调用getAll_question_ids().toString()来保存列表。 toString()调用将返回列表的字符串表示,换句话说,将返回值为String的{​​{1}}实例。此时,您不再拥有[1, 2, 3],但List看起来像列表。

这在技术上都很好,但这意味着当你试图读出那个列表时你必须考虑到这一点。

你已经写了这篇文章来回读:

String

执行此行后,String questionNumber = pref.getString(Constants.All_QUESTION_IDS, ""); 将成为questionNumber个实例,其值为String。同样,这很好,但现在我们来到关键点:我们必须将此[1, 2, 3]转换回String

如果您确定,此列表中的值中不会包含逗号,则可以轻松完成:

  • 使用List
  • 修剪字符串
  • 使用substring()
  • 创建String[]
  • 使用split()将数组转换为列表(您甚至可以跳过此步骤,因为迭代数组就像迭代列表一样简单)

把它放在一起然后你得到:

Arrays.asList()

此时,您可以遍历数组或列表:

String questionNumber = pref.getString(Constants.All_QUESTION_IDS, "");
questionNumber = questionNumber.substring(1, questionNumber.length() - 1);
String[] array = questionNumber.split(", ");
List list = Arrays.asList(array);

答案 1 :(得分:1)

当您致电//This is where I take the image from de webcam $scope.onCaptureComplete = function(src) { $scope.photo = src[0]; }; $scope.uploader = new FileUploader({ url: 'api/user/picture' }); // Called after the user selected a new picture file $scope.uploader.onAfterAddingFile = function(fileItem) { if ($window.FileReader) { var fileReader = new FileReader(); fileReader.readAsDataURL(fileItem._file); fileReader.onload = function(fileReaderEvent) { $timeout(function() { $scope.imageURL = fileReaderEvent.target.result; // console.log($scope.imageURL); $scope.localImg = true; }, 0); }; } }; // Called after the user has successfully uploaded a new picture $scope.uploader.onSuccessItem = function(fileItem, response, status, headers) { $scope.localImg = false; // Show success message $scope.success = true; // Populate user object $scope.user = Authentication.user = response; // Clear upload buttons $scope.cancelUpload(); }; // Change user profile picture $scope.uploadProfilePicture = function() { // Clear messages $scope.success = $scope.error = null; // Start upload $scope.uploader.uploadAll(); }; 时,实际存储的内容取决于editor.putString(Constants.All_QUESTION_IDS,((SOMETHING.toString())));类型toString方法的实施情况(本例中为SOMETHING)。所以避免这样做。相反,由于您已经在使用Gson或Jackson(或其他人),请将String[]存储为JSON:

question_ids

您的实际存储值不再取决于您无法控制的内容(String []。toString)。它是一个有效的JSON数组,无论您使用什么工具/库来回读它,它都是有效的。

现在,回读存储的数据:

final String jsonIds = gson.toJson (resp.getQuestion().getAll_question_ids());
editor.putString(Constants.All_QUESTION_IDS, jsonIds);