You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何根据API返回数量动态创建按钮?

解决方案:直接在onPostExecute()中动态创建按钮

当然可以在onPostExecute()方法里直接声明并创建按钮,这才是更高效、灵活的做法——完全不需要预先创建50个按钮的数组,既浪费内存,还可能出现数组越界的问题。

核心思路

你不需要提前知道按钮数量,因为当onPostExecute()拿到API返回的完整数据后,已经能通过games.length()获取到当日对阵的数量,此时再按需创建对应数量的按钮即可。

修改后的完整代码

public class ChooseMatchupActivity extends AppCompatActivity { 
    // 移除预先声明的按钮数组,不需要了!
    private LinearLayout ll;
    private LinearLayout.LayoutParams lp;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_choose_matchup); 
        String apiFeedUrl = "https://api.somesportssite.com/pull/current/daily_game_schedule.json?fordate=20180113"; 
        ll = findViewById(R.id.matchup_layout); 
        lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

        // 直接发起API请求即可,不用提前创建按钮
        new RetrieveFeedTask().execute(apiFeedUrl); 
    } 

    class RetrieveFeedTask extends AsyncTask<String, Void, String> { 
        protected void onPreExecute() {} 

        protected String doInBackground(String... urls) { 
            String url = urls[0]; 
            String response = null; 
            try {
                URLConnection connection = new URL(url).openConnection(); 
                InputStreamReader streamReader = new InputStreamReader(connection.getInputStream()); 
                BufferedReader in = new BufferedReader(streamReader); 
                StringBuilder stringBuilder = new StringBuilder(); 
                String line; 
                while ((line = in.readLine()) != null) { 
                    stringBuilder.append(line).append("\n"); 
                } 
                response = stringBuilder.toString(); 
            } catch (IOException e) {
                e.printStackTrace();
            }
            return response; 
        } 

        protected void onPostExecute(String response) { 
            /* 获取所有对阵信息并动态创建按钮 */ 
            try{ 
                JSONObject obj = new JSONObject(response); 
                JSONArray games = obj.getJSONObject("dailygameschedule").getJSONArray("gameentry"); 

                // 循环创建按钮,数量完全匹配API返回的对阵数
                for (int i = 0; i < games.length(); i++){ 
                    String awayTeam = games.getJSONObject(i).getJSONObject("awayTeam").getString("Name"); 
                    String homeTeam = games.getJSONObject(i).getJSONObject("homeTeam").getString("Name"); 
                    String matchUpStr = awayTeam + "\n" + homeTeam; 

                    // 在这里创建单个按钮并配置属性
                    Button matchupBtn = new Button(ChooseMatchupActivity.this);
                    matchupBtn.setTextSize(30); 
                    matchupBtn.setGravity(Gravity.START);
                    matchupBtn.setText(matchUpStr);

                    // 添加到布局
                    ll.addView(matchupBtn, lp); 
                } 
            } catch (JSONException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
}

关键修改点说明

  • 移除了冗余的Button matchupButtons[]数组,避免不必要的内存占用。
  • 将按钮的创建、配置逻辑移到onPostExecute()的循环中,每遍历一个对阵信息就创建一个对应按钮,数量完全匹配实际需求。
  • 修复了doInBackground()中未捕获IOException的问题(原代码会编译报错)。

额外提示

如果后续需要对这些按钮做统一操作(比如批量设置点击事件),可以在onPostExecute()中把创建的按钮存入一个List<Button>集合中,而不是固定长度的数组,这样更灵活。

内容的提问来源于stack exchange,提问作者Slaknation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:04:19