【发布时间】:2021-09-01 18:37:21
【问题描述】:
现在,当我的应用启动时,我必须单击该按钮两次才能显示数据。我想要 打开显示数据的应用程序。不使用 onclick 方法,来自 volley api 请求的数据不会加载。我正在使用 recyclerviw 将数据绑定到视图。我什至尝试创建一个单独的类来获取数据,但只适用于按钮点击。
private ArrayList<Stocks_data_model> exampleList;
private RequestQueue mQueue;
static String t;
static String n;
static String p;
static String c;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQueue = MySingleton.getInstance(this).getRequestQueue();
exampleList = new ArrayList<>();
findViewById(R.id._button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
my_func(exampleList);
} catch (Exception e) {
e.printStackTrace();
}
}
});
//real data
}
public void my_func(ArrayList mAr){
// exampleList = new ArrayList<>();
String _url = "";
// TODO: Handle error
// Toast.makeText(getApplicationContext(), "[NETWORK ERROR]\nCheck Data Connection...", Toast.LENGTH_SHORT).show();
JsonObjectRequest req_Gainers2 = new JsonObjectRequest
(Request.Method.GET, _url, null, response -> {
try {
Log.d("tag", "working");
for(int i=0; i<5; i++){
JSONArray gainers = response.getJSONArray("mostGainerStock");
JSONObject myData = gainers.getJSONObject(i);
String _name = myData.getString("companyName");
String _ticker = myData.getString("ticker");
String _price = myData.getString("price");
double _changes = myData.getDouble("changes");
String _change_percent = myData.getString("changesPercentage");
mAr.add(new Stocks_data_model(_ticker, _name, _price, _change_percent));
// exampleList.add(new Stocks_data_model(_ticker, "name", "$10.99", _change_percent));
t = _ticker;
n=_name;
p=_price;
c=_change_percent;
}
} catch (JSONException e) {
e.printStackTrace();
}
}, Throwable::printStackTrace);
// mQueue.add(req_Gainers2);
mQueue.add(req_Gainers2);
buildRecyclerView();
}
}
经过一些反馈,这是我尝试的新 onCreate 方法,但仍然出现同样的问题。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQueue = MySingleton.getInstance(this).getRequestQueue();
exampleList = new ArrayList<>();
findViewById(R.id._button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
my_func(exampleList);
buildRecyclerView();
} catch (Exception e) {
e.printStackTrace();
}
}
});
【问题讨论】:
-
我猜这是因为
buildRecyclerView在网络请求有机会完成之前被调用,而您可能是想在之后调用它? -
基本上@HenryTwist 所说的是正确的,您正在使用 volley 进行异步调用,您应该在响应内部而不是外部构建/通知您的 recycleView 更改数据
标签: java android json android-recyclerview android-volley