第一行代码———removeAllViews()的问题

问题描述:在完成了第一行代码的酷欧天气的手动刷新功能之后发现了如下问题。
在这里插入图片描述

刷新或者手动更换城市之后
在这里插入图片描述
天气预报出现了两次。下面上相关代码

private void showWeatherInfo(WeatherForecastBean weather){
        String cityName = Utility.handleString(weather.getBasic().getLocation());
        /*2019-04-10 13:55 只得到13:55 使用.split(" ")[1];*/
        String updateTime = weather.getUpdate().getLoc().split(" ")[1];
        String updateTime1 = updateTime.substring(0,updateTime.length()-1);

        titleCity.setText(cityName);
        titleUpdateTime.setText("更新时间:"+updateTime1);
        forecastLayout.removeAllViews();
       /* int k=0;
        for(int i=0;i<forecastLayout.getChildCount();){
            forecastLayout.removeViewAt(0);
            k = forecastLayout.getChildCount();
        }*/
        Log.i("Count--","-1-"+forecastLayout.getChildCount());
        for (DailyForecastBean dailyForecast :weather.getDaily_forecast()){
            /*inflate()的作用就是将一个用xml定义的布局文件查找出来inflate(int resource, ViewGroup root, boolean attachToRoot)
            * resource:需要加载布局文件的id,意思是需要将这个布局文件中加载到Activity中来操作
            * root:需要附加到resource资源文件的根控件,
            * 就是inflate()会返回一个View对象,如果第三个参数attachToRoot为true,
            * 就将这个root作为根对象返回,
            * 否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,
            * 也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象*/
            /*View是Android中所有控件的基类*/
            View view = LayoutInflater.from(this).inflate(R.layout.forcast_item,forecastLayout,false);
            TextView dataText = (TextView) view.findViewById(R.id.date_text);
            TextView infoText = (TextView) view.findViewById(R.id.info_text);
            TextView maxText = (TextView) view.findViewById(R.id.max_text);
            TextView minText = (TextView) view.findViewById(R.id.min_text);
            dataText.setText(Utility.handleString(dailyForecast.getDate()));
            infoText.setText(Utility.handleString(dailyForecast.getCond_txt_d()));
            maxText.setText(Utility.handleString(dailyForecast.getTmp_max())+"   ℃");
            minText.setText(Utility.handleString(dailyForecast.getTmp_min())+"℃   ~");
            forecastLayout.addView(view);
        }
        Log.i("Count--","-2-"+forecastLayout.getChildCount());
        weatherLayout.setVisibility(View.VISIBLE);
        Toast.makeText(WeatherActivity.this,"刷新成功!",Toast.LENGTH_SHORT).show();
    }

下面是控制台的输出:可以看到在forecastLayout.removeAllViews();之后的forecastLayout.getChildCount()的个数是0,第一次进入函数调用这个循环forecastLayout.getChildCount()是7个,也就是7天的预报在这里插入图片描述
再看下拉刷新之后的控制台,循环之前确实已经remove了所有的子控件,但是循环出来子控件变成了14个,这或许就不该把目光放在forecastLayout.removeAllViews();上了,而是放在View上面,显然是增加了多个而不是没有移除之前的。
在这里插入图片描述
接着我们验证自己的猜想,改变Log的输出,观察控制台输出。

private void showWeatherInfo(WeatherForecastBean weather){
  		......
        Log.i("Count--","1-->"+forecastLayout.getChildCount());
        for (DailyForecastBean dailyForecast :weather.getDaily_forecast());
            ......
            forecastLayout.addView(view);
            Log.i("Count--","2-->"+forecastLayout.getChildCount());
        }
        Log.i("Count--","3-->"+forecastLayout.getChildCount());
        weatherLayout.setVisibility(View.VISIBLE);
        Toast.makeText(WeatherActivity.this,"刷新成功!",Toast.LENGTH_SHORT).show();
    }

启动APP,不刷新第一遍没有问题在这里插入图片描述
下拉刷新之后的控制台,走了十四次循环。
在这里插入图片描述
现在有充分的的理由怀疑是循环出了问题,这里的weather.getDaily_forecast()应该没有清空;调试一下!

for (DailyForecastBean dailyForecast :weather.getDaily_forecast()){
......
}

在这里插入图片描述
第一次进入是7个大小,刷新!果然变成了14,对象未清空!
在这里插入图片描述
在我的网络请求的对象解析中,把这个清空一下,问题解决!

 public static WeatherForecastBean handleWeatherForecast(List<Forecast> list){
        dailyForecastlist.clear();
        Gson gson = new Gson();
        for(int i = 0;i<7;i++){
            DailyForecastBean dailyForecast = new DailyForecastBean();
            dailyForecast.setCond_code_d(gson.toJson(list.get(0).getDaily_forecast().get(i).getCond_code_d()));/*白天天气状况代码*/
            dailyForecast.setCond_code_n(gson.toJson(list.get(0).getDaily_forecast().get(i).getCond_code_n()));/*晚间天气状况代码*/
			......
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中实现复杂调查问卷的代码可以分为以下几个步骤: 1. 创建调查问卷的数据结构,包括问题、选项、答案等信息。 2. 创建调查问卷的 UI 界面,包括问题、选项、按钮等控件。 3. 将数据与 UI 界面进绑定,使得调查问卷的内容可以动态显示和修改。 4. 实现调查问卷的逻辑,包括用户的回答、问题的跳转、答案的计算等。 5. 将调查问卷的结果保存到本地或上传到服务器。 以下是一个简单的示例代码,仅供参考: ``` public class SurveyActivity extends AppCompatActivity { private List<Question> mQuestions; private int mCurrentIndex = 0; private TextView mQuestionTextView; private LinearLayout mOptionsLayout; private Button mPrevButton; private Button mNextButton; private Button mSubmitButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_survey); // 初始化调查问卷数据 mQuestions = new ArrayList<>(); mQuestions.add(new Question("问题1", new String[]{"选项1", "选项2", "选项3"})); mQuestions.add(new Question("问题2", new String[]{"选项1", "选项2", "选项3"})); mQuestions.add(new Question("问题3", new String[]{"选项1", "选项2", "选项3"})); // 初始化 UI 控件 mQuestionTextView = findViewById(R.id.question_text_view); mOptionsLayout = findViewById(R.id.options_layout); mPrevButton = findViewById(R.id.prev_button); mNextButton = findViewById(R.id.next_button); mSubmitButton = findViewById(R.id.submit_button); // 绑定 UI 控件与数据 updateQuestion(); // 设置按钮的点击事件 mPrevButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCurrentIndex--; updateQuestion(); } }); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCurrentIndex++; updateQuestion(); } }); mSubmitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 计算问卷结果并保存到本地或上传到服务器 // ... } }); } private void updateQuestion() { // 更新问题和选项的显示 Question question = mQuestions.get(mCurrentIndex); mQuestionTextView.setText(question.getQuestion()); mOptionsLayout.removeAllViews(); for (String option : question.getOptions()) { RadioButton radioButton = new RadioButton(this); radioButton.setText(option); mOptionsLayout.addView(radioButton); } // 更新按钮的状态 mPrevButton.setEnabled(mCurrentIndex > 0); mNextButton.setEnabled(mCurrentIndex < mQuestions.size() - 1); mSubmitButton.setEnabled(mCurrentIndex == mQuestions.size() - 1); } } class Question { private String mQuestion; private String[] mOptions; public Question(String question, String[] options) { mQuestion = question; mOptions = options; } public String getQuestion() { return mQuestion; } public String[] getOptions() { return mOptions; } } ``` 注意:上述代码仅为示例代码,实际开发中还需要考虑更多的细节和异常情况,如数据合法性检查、用户回答的合法性检查、网络连接状态等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值