我正在尝试学习改造,我已成功尝试发布数据,现在我正在尝试检索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个数字的按钮,但我无法解决这个问题。
我查看过很多资源,但找不到与我的问题相关的答案,但如果有的话,我不太熟悉,无法识别类似的问题。
如果有人可以提供一些帮助,我将不胜感激!
答案 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);