如何解决java.lang.IndexOutOfBoundsException:索引0无效,大小为0?

时间:2015-04-27 04:47:26

标签: android autocompletetextview

我有两个autocompletetextview,在第一个autocompletetextview中我使用json从服务器获取项目,以下是对此的响应

{"status":"success","clientlist":[{"cid":"1","name":"margi"},{"cid":"2","name":"steven"}],"productboxtype":[{"pbxid":"1","pbxname":"1 Dozen","qtyperbox":"12"},{"pbxid":"2","pbxname":"2 Dozens","qtyperbox":"24"},{"pbxid":"3","pbxname":"3 Dozens","qtyperbox":"36"}]}

我可以在第一次自动填充中获取名称,并且工作正常,

现在问题是假设用户选择项目" margi"并且它的cid是1,所以我再次向服务器发送请求并尝试获取' margi'的产品名称,并且它的响应是

{"status":"success","clientproduct":[{"pid":"4","name":"kangan pair","unitprice":"1500","boxqty":"1","bulkprice":[{"minqty":"10","price":"1500"},{"minqty":"15","price":"1470"},{"minqty":"20","price":"1460"}]}]}

MAniActivity

   public class MainActivity extends Activity {

    private AutoCompleteTextView acTextView;

    private String catidtemp;
    private String catid;

    JSONParser jsonParser = new JSONParser();
    private AutoCompleteTextView autoproduct;
    private static final String FEEDBACK_URL = "";
    private static final String FEEDBACK_SUCCESS = "status";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        acTextView = (AutoCompleteTextView) findViewById(R.id.autocmplte_clorder_clname);
        acTextView.setAdapter(new SuggestionAdapterClientList(this,acTextView.getText().toString()));

        autoproduct=(AutoCompleteTextView)findViewById(R.id.autocmplte_clorder_product);
        autoproduct.setAdapter(new SuggestionAdapterClientProduct(this, autoproduct.getText().toString()));

        acTextView.setOnItemClickListener(new OnItemClickListener() {


            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub


                JsonParseClientProduct jp=new JsonParseClientProduct();
                List<SuggestGetSetClientProduct> list1 = new ArrayList<SuggestGetSetClientProduct>();
                list1 =jp.getParseJsonWCF(autoproduct.getText().toString());
                if(position < list1.size())
                new AttemptLogin(Integer.parseInt(list1.get(position).getId())).execute();
            }
        });

    }

      class AttemptLogin extends AsyncTask<String, String, String> {

        boolean failure = false;
        private ProgressDialog pDialog;

        private int selected_cid=1;
        AttemptLogin(int selected_cid){
        this.selected_cid=selected_cid;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Sending..");
            pDialog.setIndeterminate(true);
          //  pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @SuppressWarnings("unused")
        @Override
        protected String doInBackground(String...args) {
            //Check for success tag
            //int success;
            Looper.prepare();



             try {

                 JsonParseClientList jp=new JsonParseClientList();
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                 List<SuggestGetSetClientList> list =jp.getParseJsonWCF(acTextView.getText().toString());

                     for(int i = 0;i<list.size();i++)
                     {
                       if(list.get(i).getName().equals(acTextView.getText().toString()))
                       // params.add(new BasicNameValuePair("cid",list.get(i).getId()));

                           params.add(new BasicNameValuePair("cid",String.valueOf(selected_cid)));

                         //  catid=list.get(i).getId();
                      // catidtemp=list.get(i).getId();


                     }

                    catidtemp=String.valueOf(selected_cid);
                // catidtemp=list.get(i).getId();
                 System.out.println("cattttttiiiiddd????"+catidtemp);
                 params.add(new BasicNameValuePair("action", "clientproduct"));

                 System.out.println("su gayu server ma????"+params);

                 Log.d("request!", "starting");
                 // getting product details by making HTTP request
                 JSONObject json = jsonParser.makeHttpRequest (
                     FEEDBACK_URL, "POST", params);
                 //check your log for json response
                 Log.d("Login attempt", json.toString());

                 JSONObject jobj = new JSONObject(json.toString());
                 final String msg = jobj.getString("msg");




                 return json.getString(FEEDBACK_SUCCESS);

             }catch (JSONException e) {
                 e.printStackTrace();
             }
             return null;
        }

        // After completing background task Dismiss the progress dialog

        protected void onPostExecute(String file_url) {
            //dismiss the dialog once product deleted
            pDialog.dismiss();

            //parentcat.getText().clear();
    }}
      public class SuggestGetSetClientProduct {

            String id,name;
            public SuggestGetSetClientProduct(String id, String name){
                this.setId(id);
                this.setName(name);
            }
            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }

       public class JsonParseClientProduct {


            double current_latitude,current_longitude;
            public JsonParseClientProduct(){}
            public JsonParseClientProduct(double current_latitude,double current_longitude){
                this.current_latitude=current_latitude;
                this.current_longitude=current_longitude;
            }
            public List<SuggestGetSetClientProduct> getParseJsonWCF(String sName)
               {
                List<SuggestGetSetClientProduct> ListData = new ArrayList<SuggestGetSetClientProduct>();
                try {
                   String temp=sName.replace(" ", "%20");


                   System.out.println("what the...."+js);
                   URLConnection jc = js.openConnection();
                   BufferedReader reader = new BufferedReader(new InputStreamReader(jc.getInputStream()));
                   String line = reader.readLine();
                   JSONObject jsonResponse = new JSONObject(line);
                   Log.d("test", "Response : " +jsonResponse);
                   JSONArray jsonArray = jsonResponse.getJSONArray("clientproduct");
                   for(int i = 0; i < jsonArray.length(); i++){
                       JSONObject r = jsonArray.getJSONObject(i);
                       ListData.add(new SuggestGetSetClientProduct(r.getString("pid"),r.getString("name")));
                   }


               } catch (Exception e1) {
                   // TODO Auto-generated catch block
                   e1.printStackTrace();
               }
                return ListData;

               }
        }
        public class SuggestionAdapterClientProduct extends ArrayAdapter<String>{


            protected static final String TAG = "SuggestionAdapter";
            List<String> suggestions = new ArrayList<String>();
           // private List<String> suggestions;
            public SuggestionAdapterClientProduct(Activity context, String nameFilter) {
                super(context, android.R.layout.simple_dropdown_item_1line);
                suggestions = new ArrayList<String>();
            }

            @Override
            public int getCount() {
                return suggestions.size();
            }

            @Override
            public String getItem(int index) {
                return suggestions.get(index);
            }

            @Override
            public Filter getFilter() {
                Filter myFilter = new Filter() {
                    @Override
                    protected FilterResults performFiltering(CharSequence constraint) {
                        FilterResults filterResults = new FilterResults();
                        JsonParseClientProduct jp=new JsonParseClientProduct();
                        if (constraint != null) {
                            // A class that queries a web API, parses the data and
                            // returns an ArrayList<GoEuroGetSet>

                            List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>();
                            new_suggestions =jp.getParseJsonWCF(constraint.toString());
                            Log.d("test", "Size of array : " +new_suggestions.size());
                          //List<SuggestGetSetClientProduct> new_suggestions =jp.getParseJsonWCF(constraint.toString());
                            suggestions.clear();
                            /*for (int i=0;i<new_suggestions.size();i++) {
                            suggestions.add(new_suggestions.get(i).getName());
                        }*/

                        for (int i=0;i<new_suggestions.size();i++) {
                            String name=new_suggestions.get(i).getName();
                            String id=new_suggestions.get(i).getId();
                            System.out.println("checis id"+id);
                            if(name.contains(constraint)){
                            suggestions.add(new_suggestions.get(i).getName());


                               }   
                        }
                            // Now assign the values and count to the FilterResults
                            // object
                            filterResults.values = suggestions;
                            filterResults.count = suggestions.size();
                        }
                        return filterResults;
                    }

                    @Override
                    protected void publishResults(CharSequence contraint,
                            FilterResults results) {
                        if (results != null && results.count > 0) {
                            notifyDataSetChanged();
                        } else {
                            notifyDataSetInvalidated();
                        }
                    }
                };
                return myFilter;
            }
        }
}

enter image description here enter image description here enter image description here

4 个答案:

答案 0 :(得分:3)

  

java.lang.IndexOutOfBoundsException:索引0无效,大小为0   java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)

我相信问题就在这里,

 List<SuggestGetSetClientProduct> new_suggestions =jp.getParseJsonWCF(constraint.toString());

您是否初始化了ArrayList

List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>;

首先检查ArrayList的大小,然后再转到For循环。

编辑:

您的代码应该是,

                if (constraint != null) {

                   List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>();
                   new_suggestions =jp.getParseJsonWCF(constraint.toString());
                   Log.d("test", "Size of array : " +new_suggestions.size());

               // rest code here..//

另外,您没有在SuggestionAdapterClientProduct课程

中初始化您的列表
 private List<String> suggestions;

初始化您的arrayList,

List<String> suggestions = new ArrayList<String>();

在那个班里。

答案 1 :(得分:3)

我犯了一些错误......我解决了......我的onitemclick ..

ERROR

答案 2 :(得分:0)

为什么不尝试这样

List<SuggestGetSetClientProduct> new_suggestions=new ArrayList<>();

然后

new_suggestions =jp.getParseJsonWCF(constraint.toString());

答案 3 :(得分:0)

我这样解决了这个问题:

public class ServiceListAdapter extends RecyclerView.Adapter<ServiceListAdapter.MyViewHolder> {

    private ArrayList<Types> mtypesarray;
    Context context;
    ClickItem clickItem;

    public ServiceListAdapter(Context context, ArrayList<Types>typesarray, ClickItem clickItem) {
        this.context = context;
        this.clickItem = clickItem;
}

将此更改为:

public class ServiceListAdapter extends RecyclerView.Adapter<ServiceListAdapter.MyViewHolder> {
    private ArrayList<Types> mtypesarray;
    Context context;
    ClickItem clickItem;

    public ServiceListAdapter(Context context, ArrayList<Types>typesarray, ClickItem clickItem) {
        this.context = context;
        this.clickItem = clickItem;
        mtypesarray = typesarray;
}