从 JSON 读取整数并将其添加到数组列表
Read Integer from JSON and add it to an arraylist
我想从 URL(JSON 格式)读取数据并将这些值添加到 ArrayList
。
我测试了 URL 部分的读数,这有效。但出于某种原因,我无法将读取的值添加到 ArrayList
有人知道为什么会发生这种情况以及我该如何解决它吗?
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class SaldoActivity extends AppCompatActivity {
private RequestQueue requestQueue;
private ArrayList<String> names;
private ArrayList<Integer> payList;
private ArrayList<Integer> totalList;
private ArrayList<Integer> debtList = new ArrayList<Integer>();
private int offset = 1;
private String email;
private int previousID;
private int loginID;
private int totalPerPerson;
private int info;
private static final String GET_LAST_URL = "https://studev.groept.be/api/a21pt120/getPreviousIDFromGroup/";
private static final String QUEUE_URL_LOGIN_ID = "https://studev.groept.be/api/a21pt120/getLoginID/";
private static final String GET_PAY_AMOUNT_PER_NAME = "https://studev.groept.be/api/a21pt120/payedPerPerson/";
private static final String GET_TOTAL_AMOUNT = "https://studev.groept.be/api/a21pt120/totalPayed/";
@Override
protected void onCreate(Bundle savedInstanceState) {
//READING FROM DATABASE DOESNT WORK -> SOMETHING ABOUT THE ARRAYLIST
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saldo);
getPayList();
Bundle extras = getIntent().getExtras();
email = (String) extras.get("email");
names = GroupActivity.getNamesList();
//######## TRANSACTIONS ###########
Button newTransaction = findViewById(R.id.button3);
newTransaction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onAddTransaction_Clicked();
}
});
//##################################
ListView saldoList = findViewById(R.id.saldoList);
TextView lblGroup = findViewById(R.id.lblGroup);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1, names);
saldoList.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
//######### DELETE BUTTON ###########
JsonArrayRequest loginIDRequest = new JsonArrayRequest(Request.Method.GET, QUEUE_URL_LOGIN_ID + email,null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0; i<response.length(); ++i) {
loginID = 0;
JSONObject o = null;
try {
loginID += response.getJSONObject(i).getInt("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
JsonArrayRequest previousIDRequest = new JsonArrayRequest(Request.Method.GET,GET_LAST_URL + Integer.toString(loginID),null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0; i<response.length(); ++i) {
previousID = 0;
JSONObject o = null;
try {
previousID += response.getJSONObject(i).getInt("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(SaldoActivity.this, "Unable to communicate with the server", Toast.LENGTH_LONG).show();
}
});
requestQueue.add(previousIDRequest);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(SaldoActivity.this, "Unable", Toast.LENGTH_LONG).show();
}
});
requestQueue.add(loginIDRequest);
calculateTotalPerPerson();
calculateDebtList();
lblGroup.setText(Integer.toString(payList.get(0)));
saldoList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
int amount = debtList.get(i);
Toast.makeText(SaldoActivity.this, Integer.toString(amount), Toast.LENGTH_LONG).show();
}
});
}
public void onAddTransaction_Clicked() {
Intent intent = new Intent(this, AddTransaction.class);
startActivity(intent);
}
public void onDeleteGroup_Clicked(View caller) throws InterruptedException {
if(previousID == GroupActivity.getID()){
offset++;
}
String url = "https://studev.groept.be/api/a21pt120/deleteGroup/" + GroupActivity.getID();
httpCall(url);
String url_offset = "https://studev.groept.be/api/a21pt120/deleted_input/" + offset;
httpCall(url_offset);
Intent intent = new Intent(this, GroupActivity.class);
timeout();
intent.putExtra("email", email);
startActivity(intent);
}
private void calculateDebtList() {
for(int i = 0; i < payList.size(); i++){
int debt = payList.get(i) - totalPerPerson;
debtList.add(debt);
}
}
private void calculateTotalPerPerson() {
if(names.size() > 0) {
totalPerPerson = calculateSum()/names.size();
}
else{
totalPerPerson = calculateSum();;
}
}
private int calculateSum() {
int sum = 0;
for(int i = 0; i < totalList.size(); i++)
sum += totalList.get(i);
return sum;
}
private void timeout() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void getPayList(){
RequestQueue requestQueue = Volley.newRequestQueue(GroupActivity.returnContext());
String url = GET_PAY_AMOUNT_PER_NAME + GroupActivity.getID();
StringRequest submitRequest = new StringRequest(Request.Method.GET, url,
response -> {
try {
JSONArray responseArray = new JSONArray(response);
payList = new ArrayList<>();
for(int i = 0; i<responseArray.length(); i++) {
JSONObject curObject = responseArray.getJSONObject(i);
payList.add(curObject.getInt("totalPerPerson"));
}
}
catch (JSONException e)
{
Log.e("Error", e.toString());
}
},
error -> Log.e("Error", "Could not reach database"));
requestQueue.add(submitRequest);
}
}
我想将 int 值添加到 payList 中。但是 add()
并不能解决问题。
当我尝试使用 lblGroup.setText(Integer.toString(payList.get(0))) 从支付列表中获取第一个元素时;
(我用的例子里面应该有3个),app崩溃是因为paylist里面没有元素。
这是我从 URL 得到的 JSON。我想在名为 payList
的 ArrayList
中设置值 200、3、10
[ { "totalPerPerson": "200" }, { "totalPerPerson": "3" }, { "totalPerPerson": "10" } ]
我认为您是直接尝试将字符串数字值添加到 Int 数组 payList
所以首先使用 Integer.parseInt()
转换为 Parse int
试试下面的代码,这可能会有帮助
try {
JSONArray responseArray = new JSONArray(response);
payList = new ArrayList<>();
for(int i = 0; i<responseArray.length(); i++) {
JSONObject curObject = responseArray.getJSONObject(i);
payList.add(Integer.parseInt(curObject.getInt("totalPerPerson"))); //check here
}
}
catch (JSONException e)
{
Log.e("Error", e.toString());
}
我想从 URL(JSON 格式)读取数据并将这些值添加到 ArrayList
。
我测试了 URL 部分的读数,这有效。但出于某种原因,我无法将读取的值添加到 ArrayList
有人知道为什么会发生这种情况以及我该如何解决它吗?
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class SaldoActivity extends AppCompatActivity {
private RequestQueue requestQueue;
private ArrayList<String> names;
private ArrayList<Integer> payList;
private ArrayList<Integer> totalList;
private ArrayList<Integer> debtList = new ArrayList<Integer>();
private int offset = 1;
private String email;
private int previousID;
private int loginID;
private int totalPerPerson;
private int info;
private static final String GET_LAST_URL = "https://studev.groept.be/api/a21pt120/getPreviousIDFromGroup/";
private static final String QUEUE_URL_LOGIN_ID = "https://studev.groept.be/api/a21pt120/getLoginID/";
private static final String GET_PAY_AMOUNT_PER_NAME = "https://studev.groept.be/api/a21pt120/payedPerPerson/";
private static final String GET_TOTAL_AMOUNT = "https://studev.groept.be/api/a21pt120/totalPayed/";
@Override
protected void onCreate(Bundle savedInstanceState) {
//READING FROM DATABASE DOESNT WORK -> SOMETHING ABOUT THE ARRAYLIST
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saldo);
getPayList();
Bundle extras = getIntent().getExtras();
email = (String) extras.get("email");
names = GroupActivity.getNamesList();
//######## TRANSACTIONS ###########
Button newTransaction = findViewById(R.id.button3);
newTransaction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onAddTransaction_Clicked();
}
});
//##################################
ListView saldoList = findViewById(R.id.saldoList);
TextView lblGroup = findViewById(R.id.lblGroup);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1, names);
saldoList.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
//######### DELETE BUTTON ###########
JsonArrayRequest loginIDRequest = new JsonArrayRequest(Request.Method.GET, QUEUE_URL_LOGIN_ID + email,null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0; i<response.length(); ++i) {
loginID = 0;
JSONObject o = null;
try {
loginID += response.getJSONObject(i).getInt("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
JsonArrayRequest previousIDRequest = new JsonArrayRequest(Request.Method.GET,GET_LAST_URL + Integer.toString(loginID),null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0; i<response.length(); ++i) {
previousID = 0;
JSONObject o = null;
try {
previousID += response.getJSONObject(i).getInt("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(SaldoActivity.this, "Unable to communicate with the server", Toast.LENGTH_LONG).show();
}
});
requestQueue.add(previousIDRequest);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(SaldoActivity.this, "Unable", Toast.LENGTH_LONG).show();
}
});
requestQueue.add(loginIDRequest);
calculateTotalPerPerson();
calculateDebtList();
lblGroup.setText(Integer.toString(payList.get(0)));
saldoList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
int amount = debtList.get(i);
Toast.makeText(SaldoActivity.this, Integer.toString(amount), Toast.LENGTH_LONG).show();
}
});
}
public void onAddTransaction_Clicked() {
Intent intent = new Intent(this, AddTransaction.class);
startActivity(intent);
}
public void onDeleteGroup_Clicked(View caller) throws InterruptedException {
if(previousID == GroupActivity.getID()){
offset++;
}
String url = "https://studev.groept.be/api/a21pt120/deleteGroup/" + GroupActivity.getID();
httpCall(url);
String url_offset = "https://studev.groept.be/api/a21pt120/deleted_input/" + offset;
httpCall(url_offset);
Intent intent = new Intent(this, GroupActivity.class);
timeout();
intent.putExtra("email", email);
startActivity(intent);
}
private void calculateDebtList() {
for(int i = 0; i < payList.size(); i++){
int debt = payList.get(i) - totalPerPerson;
debtList.add(debt);
}
}
private void calculateTotalPerPerson() {
if(names.size() > 0) {
totalPerPerson = calculateSum()/names.size();
}
else{
totalPerPerson = calculateSum();;
}
}
private int calculateSum() {
int sum = 0;
for(int i = 0; i < totalList.size(); i++)
sum += totalList.get(i);
return sum;
}
private void timeout() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void getPayList(){
RequestQueue requestQueue = Volley.newRequestQueue(GroupActivity.returnContext());
String url = GET_PAY_AMOUNT_PER_NAME + GroupActivity.getID();
StringRequest submitRequest = new StringRequest(Request.Method.GET, url,
response -> {
try {
JSONArray responseArray = new JSONArray(response);
payList = new ArrayList<>();
for(int i = 0; i<responseArray.length(); i++) {
JSONObject curObject = responseArray.getJSONObject(i);
payList.add(curObject.getInt("totalPerPerson"));
}
}
catch (JSONException e)
{
Log.e("Error", e.toString());
}
},
error -> Log.e("Error", "Could not reach database"));
requestQueue.add(submitRequest);
}
}
我想将 int 值添加到 payList 中。但是 add()
并不能解决问题。
当我尝试使用 lblGroup.setText(Integer.toString(payList.get(0))) 从支付列表中获取第一个元素时;
(我用的例子里面应该有3个),app崩溃是因为paylist里面没有元素。
这是我从 URL 得到的 JSON。我想在名为 payList
的ArrayList
中设置值 200、3、10
[ { "totalPerPerson": "200" }, { "totalPerPerson": "3" }, { "totalPerPerson": "10" } ]
我认为您是直接尝试将字符串数字值添加到 Int 数组 payList
所以首先使用 Integer.parseInt()
试试下面的代码,这可能会有帮助
try {
JSONArray responseArray = new JSONArray(response);
payList = new ArrayList<>();
for(int i = 0; i<responseArray.length(); i++) {
JSONObject curObject = responseArray.getJSONObject(i);
payList.add(Integer.parseInt(curObject.getInt("totalPerPerson"))); //check here
}
}
catch (JSONException e)
{
Log.e("Error", e.toString());
}