2012-08-24 5 views
1

ArrayList으로 채워진 Spinner을 만들었습니다. ArrayList에 동적으로 값을 추가하려고하므로 Spinner이 동적으로 채워집니다. 그러나 ArrayList에 값을 추가하려고 시도하면 NullPointerException이 표시됩니다.어떻게 ArrayList를 사용하여 스피너를 동적으로 업데이트합니까?

무엇이 누락 되었습니까? ArrayList을 수정하기 전에 어댑터를 재설정해야합니까? 여기

내 코드입니다 :

내 회, ArrayList를, 그리고 어댑터 :

deleteselection = (Spinner)view.findViewById(R.id.deletespinner); 
portfoliosdelete = new ArrayList<String>(); 
portfoliosdelete.add("Select Portfolio"); 
adapterdeletetype = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,portfoliosdelete){ 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) 
    { 
     View v = null; 

     // If this is the initial dummy entry, make it hidden 
     if (position == 0) { 
      TextView tv = new TextView(getContext()); 
      tv.setHeight(0); 
      tv.setVisibility(View.GONE); 
      v = tv; 
     } 
     else { 
      // Pass convertView as null to prevent reuse of special case views 
      v = super.getDropDownView(position, null, parent); 
     } 

     // Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling 
     parent.setVerticalScrollBarEnabled(false); 
     return v; 
    } 
}; 
adapterdeletetype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
deleteselection.setAdapter(adapterdeletetype); 

동적 회 업데이트 내 코드 :

else if(users.contains(usernull)){ 
    pn1 = enterportfolioname.getText().toString(); 
    user1 = new PortfolioRecord(pn1, "[email protected]"); 
    users.remove(usernull); 
    users.add(user1); 
    portfoliosdelete.add(pn1); // <-- This causes a null pointer exception 
    adapterdeletetype.notifyDataSetChanged(); 
    portfoliolist.invalidateViews(); 
+0

곳이 추가 점은 어디에 있습니까? 이 시점에서 portfoliosdelete가 설치되었는지 확실합니까? – njzk2

답변

1

아래 코드를 사용하십시오. 이 코드는 사용자가 스피너에서 새 항목을 선택하여 추가 할 때 새 항목을 추가합니다.

코드 샘플 :

레이아웃 main.xml에 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:weightSum="10" > 

    <Spinner 
     android:id="@+id/cmbNames" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

레이아웃 spinner_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

활동 클래스 :

public class MainActivity extends Activity { 
    private static final String NAME = "name"; 
    private static final String ADD_NEW_ITEM = "Add New Item"; 

    private SimpleAdapter adapter; 
    private Spinner cmbNames; 
    private List<HashMap<String, String>> lstNames; 
    private int counter; 

    private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      HashMap<String, String> map = lstNames.get(arg2); 
      String name = map.get(NAME); 
      if (name.equalsIgnoreCase(ADD_NEW_ITEM)) { 
       lstNames.remove(map); 
       counter++; 
       addNewName(String.valueOf(counter)); 
       addNewName(ADD_NEW_ITEM); 
       adapter.notifyDataSetChanged(); 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     populateList(); 

     cmbNames = (Spinner) findViewById(R.id.cmbNames); 
     adapter = new SimpleAdapter(this, lstNames, R.layout.spinner_item, 
       new String[] { NAME }, new int[] { R.id.tvName }); 
     cmbNames.setAdapter(adapter); 
     cmbNames.setOnItemSelectedListener(itemSelectedListener); 
    } 

    private void populateList() { 
     lstNames = new ArrayList<HashMap<String, String>>(); 

     addNewName("abc"); 
     addNewName("pqr"); 
     addNewName("xyz"); 
     addNewName(ADD_NEW_ITEM); 
    } 

    private void addNewName(String name) { 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(NAME, name); 
     lstNames.add(map); 
    } 
} 
+0

통찰력을 가져 주셔서 감사합니다. –

0

시도가 adapterdeletetype에서 삭제하는 대신 전화 arraylist. 실패하면 logcat 출력을 게시하십시오.

관련 문제