2016-05-16 104 views
1

負載微調這是從我的SQL數據庫加載員工姓名爲對象,並將其顯示在屏幕上我Spinner代碼:與對象和字符串

private void loadNames() { 
    //database handler 
    LysandrosDatabaseAdapter db = new LysandrosDatabaseAdapter(getApplicationContext()); 

    List<DataBean> list = db.getAllDat(); 

    //list for storing the names 
    String[] nameList = new String[list.size()]; 
    //list for storing the ID and keeping it hidden 
    employeeList = new int[list.size()]; 
    //loop to fill the list 

    nameList[0] = "All Employees"; 
    employeeList[0] = 0; 
    for (int i=0; i<list.size(); i++) { 
     nameList[i+1] = list.get(i).getName() + " " + list.get(i).getSurname(); 
     employeeList[i+1] = list.get(i).getID(); 
    } 
    //creating adapter for spinner 
    ArrayAdapter<String > dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, nameList); 
    //drop down layout style - list view with radio button 
    dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_multichoice); 
    //attaching data adapter to spinner 
    selectName.setAdapter(dataAdapter); 
} 

我想包括文本閱讀「的所有員工「作爲第一個選項,因爲我想實現一條If聲明,當用戶選擇」所有員工「選項時,應用程序將獲取一些特定數據,當用戶選擇特定員工時,例如「約翰史密斯」該應用程序將只提取該記錄的數據。

上面的代碼片段是我到目前爲止所得到的,並且我得到一個ArrayIndexOutOfBoundsException錯誤。

我的logcat表明這一點:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lysandroslysandrou.marstest4/com.example.lysandroslysandrou.marstest4.Reports}: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5 
     at com.example.lysandroslysandrou.marstest4.Reports.loadNames(Reports.java:147) 
     at com.example.lysandroslysandrou.marstest4.Reports.onCreate(Reports.java:78) 

147線是nameList[i+1] = list.get(i).getName() + " " + list.get(i).getSurname();

我試過很多其他方法,但是沒有一次成功。從我的數據庫加載保存爲「所有員工」的值也不是一個可行的解決方案。

我在尋找兩件事情:

A)爲什麼我在我的情況下,特別是得到這個錯誤? (我讀過有關此異常herehere但不明白爲什麼它的發生在這裏)

B)是否有我的問題的解決方案?

注意:如果行nameList[0] = "All EmployeesemployeeList[0] = "0"被刪除,代碼段工作正常。

編輯:我的新的堆棧跟蹤:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
     at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:415) 
     at android.support.v7.widget.AppCompatSpinner$DropDownAdapter.getDropDownView(AppCompatSpinner.java:624) 
     at android.support.v7.widget.AppCompatSpinner$DropDownAdapter.getView(AppCompatSpinner.java:620) 
     at android.support.v7.widget.AppCompatSpinner.compatMeasureContentWidth(AppCompatSpinner.java:547) 
     at android.support.v7.widget.AppCompatSpinner.access$500(AppCompatSpinner.java:65) 
     at android.support.v7.widget.AppCompatSpinner$DropdownPopup.computeContentWidth(AppCompatSpinner.java:738) 
     at android.support.v7.widget.AppCompatSpinner$DropdownPopup.show(AppCompatSpinner.java:763) 
     at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:424) 
     at android.view.View$PerformClick.run(View.java:19749) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

編輯2:這是我onItemSelected方法:

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    //On selecting a spinner item 
    String list = parent.getItemAtPosition(position).toString(); 
    //employeeId = employeeList[position]; 
    //showing selected spinner item 
    Toast.makeText(parent.getContext(), "You selected: " + list, Toast.LENGTH_SHORT).show(); 
} 

回答

1

您需要更改

//list for storing the names 
String[] nameList = new String[list.size()]; 
//list for storing the ID and keeping it hidden 
employeeList = new int[list.size()]; 

//list for storing the names 
String[] nameList = new String[list.size() + 1]; 
//list for storing the ID and keeping it hidden 
employeeList = new int[list.size() + 1]; 

因爲您需要爲第一個「所有員工」元素分配一個項目。

而當您嘗試訪問namesList[i + 1]元素時,您會收到一個提示,此時i == list.size() - 1,因此i + 1 == list.size()。例如,訪問namesList[5],當您只分配了0..4元素時String[] nameList = new String[list.size()];

我評論了一些行,因爲我沒有db。但是下面的代碼適合我:

private void loadSpinner(Spinner spinner, ArrayList<Integer> items) { 
    //list for storing the names 
    String[] nameList = new String[items.size() + 1]; 
    //list for storing the ID and keeping it hidden 
    //employeeList = new int[list.size()]; 
    //loop to fill the list 

    nameList[0] = "All Employees"; 
    //employeeList[0] = 0; 
    for (int i = 0; i < items.size(); i++) { 
     nameList[i + 1] = String.valueOf(i); 
    } 
    //creating adapter for spinner 
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, nameList); 
    //drop down layout style - list view with radio button 
    dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_multichoice); 
    //attaching data adapter to spinner 
    spinner.setAdapter(dataAdapter); 
} 
+0

非常感謝,但現在我得到了一個'java.lang。NullPointerException:嘗試在空對象引用時調用虛擬方法'java.lang.String java.lang.Object.toString()',當我點擊我的微調器時! –

+0

那段代碼適合我,所以NullPointerException是由另一部分引起的。你可以發佈更多的代碼和一個新的堆棧跟蹤? –

+0

是的,當然,我添加了新的堆棧跟蹤,但你想要更多的代碼? –