【问题标题】:How to run methods in onCreate() without button click如何在不单击按钮的情况下运行 onCreate() 中的方法
【发布时间】: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


【解决方案1】:

您提到您希望在不单击按钮的情况下加载数据,并且您将负责检索和显示数据的所有代码放在按钮的 OnClickListener 中。 如果您想在应用加载时显示数据,请从 OnClickListener 中取出所有代码。

在双击之前您看不到数据是因为,一旦您单击,数据检索就会异步开始,代码会继续运行并到达设置 recyclerview。但数据尚未检索。这就是 recyclerview 不显示任何内容的原因。

在您随后单击该按钮时,数据检索完成,recyclerview 可以显示数据。

要修复它,我们需要等到数据被检索到。这可以通过多种方式实现。 快速修复可以在 my_func() 内的 try 块的最后一行调用您的 buildRecyclerView() 函数。

【讨论】:

  • 我在尝试中调用了buildRecyclerView(),在我的功能下,但仍需要单击2 次才能显示。我将代码保存在 onclick 方法中,因为否则,正如您提到的那样,空的 recyclerview 不会发生任何事情,onclick 可以帮助我检索数据。由于 api 调用本身是异步的,使用 try/catch,我真的不需要在 oncreate 中使用另一个 tyr/catch,但使用它希望它会有所帮助。请进一步建议我如何解决此问题。我可以发布新代码
  • 很抱歉,我无法提及您应该从哪个 try 块调用 buildRecyclerView()。从 my_func() 内的 try 块的最后一行调用该函数
  • yooo 兄弟,你真是个他妈的英雄。已经研究了一个多月,只是决定问我自己的问题,因为没有一个工作,现在,一个小时后,我得到了答案。我真的很感谢你,谢谢。
  • 很高兴知道它有效。如果它解决了您的问题,您可以将我的答案标记为已接受的答案。编码快乐!!!
【解决方案2】:

要在不点击的情况下获取数据,请在点击侦听器之外调用方法。

    my_func(exampleList);

在 my_fun() 方法之前运行你的 buildRecyclerView(); oncreate 中的方法。

然后在try块的最后一行通知recyclerView的适配器更新其中的数据。

【讨论】:

    【解决方案3】:

    只需在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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多