如何解决如何在不单击按钮的情况下在 onCreate() 中运行方法
现在,我必须在我的应用程序启动时单击该按钮两次才能显示数据。我想要 打开显示数据的应用程序。如果不使用 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();
}
}
});
解决方法
您提到要在不单击按钮的情况下加载数据,并且将所有负责检索和显示数据的代码放在按钮的 OnClickListener 中。 如果您想在应用加载时显示数据,请从 OnClickListener 中取出所有代码。
在双击之前您不会看到数据,因为一旦您单击,数据检索就会异步启动,并且代码会继续运行并到达设置回收站视图。但尚未检索到数据。这就是 recyclerview 什么都不显示的原因。
在您随后单击该按钮时,数据检索完成,recyclerview 能够显示数据。
要修复它,我们需要等到数据被检索到。这可以通过多种方式实现。
一个快速解决方法是在 buildRecyclerView()
内的 try 块的最后一行调用您的 my_func()
函数。
要在不单击的情况下获取数据,请在单击侦听器之外调用方法。
my_func(exampleList);
在 my_fun() 方法运行你的 buildRecyclerView() 之前; oncreate 中的方法。
然后在 try 块的最后一行通知 recyclerView 的适配器更新其中的数据。
,只需在 onCreate
中调用您的方法。例如:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQueue = MySingleton.getInstance(this).getRequestQueue();
exampleList = new ArrayList<>();
thisIsMyFunction();
}
public void thisIsMyFunction() {
try {
my_func(exampleList);
buildRecyclerView();
} catch (Exception e) {
e.printStackTrace();
}
//you can add all the code you want to execute here
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。