YaoozU 2017-07-20 09:32 采纳率: 0%
浏览 2579

《第一行代码》的酷欧天气,点开省列表以后显示的还是省,而不是城市,这是再点一下省就直接闪退

Logcat如下
FATAL EXCEPTION: main
Process: com.coolweather.android, PID: 11807
java.lang.IndexOutOfBoundsException: Index: 6, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at com.coolweather.android.ChooseAreaFragment$1.onItemClick(ChooseAreaFragment.java:76)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3137)
at android.widget.AbsListView$3.run(AbsListView.java:4052)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6290)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

代码如下
package com.coolweather.android;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.coolweather.android.db.City;
import com.coolweather.android.db.County;
import com.coolweather.android.db.Province;
import com.coolweather.android.util.HttpUtil;
import com.coolweather.android.util.Utility;

import org.litepal.crud.DataSupport;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**

  • Created by 王耀祖 on 2017/7/20. */

public class ChooseAreaFragment extends Fragment {
public static final int LEVEL_PROVINCE = 0;
public static final int LEVEL_CITY = 1;
public static final int LEVEL_COUNTY = 2;
private ProgressDialog progressDialog;
private TextView titleText;
private Button backButton;
private ListView listView;
private ArrayAdapter adapter;
private List dataList = new ArrayList<>();
private List provinceList;
private List cityList;
private List countyList;
private Province selectedProvince;
private City selectedCity;
private int currentLevel;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.choose_area, container, false);
    titleText = (TextView) view.findViewById(R.id.title_text);
    backButton = (Button) view.findViewById(R.id.back_button);
    listView = (ListView) view.findViewById(R.id.list_view);
    adapter = new ArrayAdapter<String>(getContext(),
            android.R.layout.simple_list_item_1, dataList);
    listView.setAdapter(adapter);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (currentLevel == LEVEL_PROVINCE) {
                selectedProvince = provinceList.get(position);
                queryCities();
            } else if (currentLevel == LEVEL_CITY) {
                selectedCity = cityList.get(position);
                queryCounties();
            }
        }
    });
    backButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(currentLevel==LEVEL_COUNTY){
                queryCities();
            }
            else if(currentLevel==LEVEL_CITY){
                queryProvinces();
            }
        }
    });
    queryProvinces();
}
private void queryProvinces(){
    titleText.setText("中国");
    backButton.setVisibility(View.GONE);
    provinceList= DataSupport.findAll(Province.class);
    if(provinceList.size()>0){
        dataList.clear();
        for(Province province:provinceList)
            dataList.add(province.getProvinceName());
        adapter.notifyDataSetChanged();
        listView.setSelection(0);
        currentLevel=LEVEL_PROVINCE;
    }
    else{
        String address="http://guolin.tech/api/china";
        queryFromServer(address,"province");
    }
}
private void queryCities(){
    titleText.setText(selectedProvince.getProvinceName());
    backButton.setVisibility(View.VISIBLE);
    cityList=DataSupport.where("provinceid = ?",String.valueOf(selectedProvince
        .getId())).find(City.class);
    if(cityList.size()>0) {
        cityList.clear();
        for(City city:cityList)
            dataList.add(city.getCityName());
        adapter.notifyDataSetChanged();
        listView.setSelection(0);
        currentLevel=LEVEL_CITY;
    }
    else{
        int provinceCode=selectedProvince.getProvinceCode();
        String address="http://guolin.tech/api/china/"+provinceCode;
        queryFromServer(address,"city");
    }
}
private void queryCounties(){
    titleText.setText(selectedCity.getCityName());
    backButton.setVisibility(View.VISIBLE);
    countyList=DataSupport.where("cityid = ?",String.valueOf(selectedCity
            .getId())).find(County.class);
    if(countyList.size()>0) {
        countyList.clear();
        for(County county:countyList)
            dataList.add(county.getCountyName());
        adapter.notifyDataSetChanged();
        listView.setSelection(0);
        currentLevel=LEVEL_COUNTY;
    }
    else{
        int provinceCode=selectedProvince.getProvinceCode();
        int cityCode=selectedCity.getCityCode();
        String address="http://guolin.tech/api/china/"+provinceCode+"/"+cityCode;
        queryFromServer(address,"county");
    }
}
private void queryFromServer(String address,final String type){
    showProgressDialog();
    HttpUtil.sendOkHttpRequest(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    closeProgressDialog();
                    Toast.makeText(getContext(), "加载失败", Toast.LENGTH_SHORT).show();
                }
            });
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String responseText=response.body().string();
            boolean result=false;
            if("province".equals(type))
                result= Utility.handleProvinceResponse(responseText);
            else if("city".equals(type))
                result=Utility.handleCityResponse(responseText,selectedProvince.getId());
            else if("county".equals(type))
                result=Utility.handleCountyResponse(responseText,selectedCity.getId());
            if(result){
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        closeProgressDialog();
                        if("province".equals(type))
                            queryProvinces();
                        else if("city".equals(type))
                            queryCities();
                        else if("county".equals(type))
                            queryCounties();
                    }
                });
            }
        }
    });
}
private void showProgressDialog(){
    if(progressDialog==null){
        progressDialog=new ProgressDialog(getActivity());
        progressDialog.setMessage("正在加载。。。");
        progressDialog.setCanceledOnTouchOutside(false);
    }
    progressDialog.show();
}
private void closeProgressDialog(){
    if(progressDialog!=null)
        progressDialog.dismiss();
}

}

  • 写回答

1条回答 默认 最新

  • code小生 2017-07-20 09:38
    关注

    建议和源码对比一下看看 全书源代码

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面