2014-01-31 2 views
0

Недавно я начал программировать для Android, и я хочу сделать программу, которая немного сложнее для практики.listview crash после того, как я положил в cutom arrayadapter

Я столкнулся с проблемой, связанной с тем, как работают классы java, и я не могу отлаживать ее с тем, что я знаю на данный момент.

Я написал код, который отлично работает, когда я помещаю listView в массив массивов по умолчанию, но как только я пытаюсь сделать свой собственный массив, он разбивается, как только он пытается обновить listView. Вот часть кода, связанного для заказа адаптера:

private Button buttonNovoIme; 
private ListView lvRadnici; 
private ArrayList <String> listaRadnikaArray; 
private StableArrayAdapter adapter; 
private EditText novoIme; 
private TextView buferZaIme; 
private TextView errorText; 



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


    buttonNovoIme= (Button) findViewById(R.id.buttonNovoIme); 
    lvRadnici = (ListView) findViewById(R.id.listViewRadnici); 
    listaRadnikaArray = new ArrayList<String>(); 
    novoIme = (EditText) findViewById(R.id.editTextNovoIme); 
    errorText= (TextView) findViewById(R.id.errorText); 

final StableArrayAdapter adapter = new StableArrayAdapter (this, R.layout.listview_podesavanje , listaRadnikaArray); 
    lvRadnici.setAdapter(adapter); 

buttonNovoIme.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 


      if (listaRadnikaArray.contains(novoIme.getText().toString()) || novoIme.getText().toString().matches("")) { 


        if (novoIme.getText().toString().matches("")) { 
          errorText.setText("prazno");  
        } 
        else { 
         errorText.setText("duplikat"); 
        } 


      } 

      else { 
      listaRadnikaArray.add(novoIme.getText().toString()); 
      adapter.notifyDataSetChanged(); 
      errorText.setText(""); 
      } 

      novoIme.setText(""); 
     } 
    }); 

и вот мой заказ arrayadapter, это стандартная марка:

private class StableArrayAdapter extends ArrayAdapter<String> { 

      HashMap<String, Integer> mIdMap = new HashMap<String, Integer>(); 

      public StableArrayAdapter(Context context, int textViewResourceId, 
       List<String> objects) { 
       super(context, textViewResourceId, objects); 
       for (int i = 0; i < objects.size(); ++i) { 
       mIdMap.put(objects.get(i), i); 
       } 
      } 

      @Override 
      public long getItemId(int position) { 
       String item = getItem(position); 
       return mIdMap.get(item); 
      } 

      @Override 
      public boolean hasStableIds() { 
       return true; 
      } 

      } 

вот мой журнал ошибок

01-31 15:04:06.385: E/AndroidRuntime(858): FATAL EXCEPTION: main 
01-31 15:04:06.385: E/AndroidRuntime(858): java.lang.NullPointerException 
01-31 15:04:06.385: E/AndroidRuntime(858): at com.example.organizatorsmena.OrganizatorSmena$StableArrayAdapter.getItemId(OrganizatorSmena.java:263) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.AbsListView.obtainView(AbsListView.java:2292) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.ListView.onMeasure(ListView.java:1156) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.View.measure(View.java:15172) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.View.measure(View.java:15172) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.View.measure(View.java:15172) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.View.measure(View.java:15172) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-31 15:04:06.385: E/AndroidRuntime(858): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.View.measure(View.java:15172) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.Choreographer.doFrame(Choreographer.java:525) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.os.Handler.handleCallback(Handler.java:615) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:137) 
01-31 15:04:06.385: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-31 15:04:06.385: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 15:04:06.385: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:511) 
01-31 15:04:06.385: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-31 15:04:06.385: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-31 15:04:06.385: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method) 

Благодарю.

ответ

0

ОК я решаю проблему. Это была ошибка с hashMap. Я не знал, что когда вы создаете пользовательские строки ArrayAdapter, которые появляются сразу после того, как конструктор НЕ будет обновляться на обычных базах.

public StableArrayAdapter(Context context, int textViewResourceId, 
      List<String> objects) { 
      super(context, textViewResourceId, objects); 
      for (int i = 0; i < objects.size(); ++i) { // this will not auto-refresh after 
      mIdMap.put(objects.get(i), i);   // you change items in ArrayList 
      } 

так, что мне нужно сделать, это переопределить notifyDataSetChanged()

public void notifyDataSetChanged (List<String> newObject){ 
       super.notifyDataSetChanged(); 
       for (int i = 0; i < newObject.size(); ++i) { 
        mIdMap.put(newObject.get(i), i); 

теперь каждый раз, когда я обновить ArrayList с adapter.notifyDataSetChanged (ArrayList) будет также обновить HashMap.

1

Вы создаете пустой ArrayList, то при условии, что к адаптеру:

listaRadnikaArray = new ArrayList<String>(); // this is empty 
novoIme = (EditText) findViewById(R.id.editTextNovoIme); 
errorText= (TextView) findViewById(R.id.errorText); 
final StableArrayAdapter adapter = new StableArrayAdapter (this, R.layout.listview_podesavanje , listaRadnikaArray); 

Вы должны поставить некоторые элементы в вашем ArrayList, прежде чем использовать его в адаптере.

+0

Спасибо, но это не так. Я попытался поместить некоторые элементы в список массивов, и у меня был такой же сбой. – CrazyFox

Смежные вопросы