NullpointerException bei dynamischen Button

  • 3 Antworten
  • Neuester Beitrag
Diskutiere NullpointerException bei dynamischen Button im Android App Entwicklung im Bereich Betriebssysteme & Apps.
0

0xnull

Neues Mitglied
Hallo zusammen,

mich plagt momentan eine Nullpointer-Exception und ich weiß leider nicht, wie ich sie beheben kann. In einer ListView stelle ich verschiedene Sprachen als Strings dar. Klicke ich lange auf eine, so öffnet sich ein Kontextmenü mit den Einträgen "edit" und "delete". Klickt man auf "edit", so soll in der entsprechenden ListView-Zeile anstatt der Sprache ein EditText und ein Button erscheinen. Sobald ich diesem Button einen onClickListener zuweisen möchte, kommt es aber zur NullpointerException, da der Button aus irgendeinem Grund null bleibt. Die Exception tritt in der "editLanguage"-Methode auf.


Hier der entsprechende Code:

Kontextmenü
Code:
public boolean onContextItemSelected(MenuItem item) {

        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        LanguageItem selectedLanguage = languages.get((int) info.id);

        switch (item.getItemId()) {
        case EDIT: 
            languages.get((int) info.id).setSelected(); // set edit flag
            adapter.update(languages);
            adapter.notifyDataSetChanged(); 
            editLanguage(selectedLanguage); // update database
            break;
        case DELETE:
Im Adapter:
Code:
public View getView(int position, View convertView, ViewGroup parent) {
        
        ViewHolder viewHolder; // ViewHolder pattern 
        int type = getItemViewType(position); 
    
        
        if (convertView == null) {    
            viewHolder = new ViewHolder();
            LayoutInflater inflater =  ((Activity) getContext()).getLayoutInflater();
            
            switch(type) {
            case DEFAULT_LINE: 
                convertView = inflater.inflate(R.layout.language_row_default, null);
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tv_language_default_line);                
                break;
            case EDIT_LINE: 
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.language_row_edit, null);
                viewHolder.editText = (EditText) convertView.findViewById(R.id.ed_language_change);
                viewHolder.button = (Button) convertView.findViewById(R.id.bu_language_change);
                break;
            default:
                // TODO throw exception
                Log.i(TAG, "default" + type);
            }
            
            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag(); // avoided to call findViewById
        }
            
        
        switch(type) {
        case DEFAULT_LINE:
            viewHolder.textView.setText(languageItems.get(position).getLanguageName());
            break;
        case EDIT_LINE:
            viewHolder.editText.setText(languageItems.get(position).getLanguageName());
            break;
        }
        
        
        Log.i(TAG, "getView");
        return convertView;
    }
editLanguage-Methode

Code:
rivate void editLanguage(final LanguageItem languageToEdit) {

        final EditText editLanguage = (EditText) this.findViewById(R.id.ed_language_change); // [COLOR=Red]--> hier kommt es zur NullpointerException[/COLOR]
        Button editButtonConfirm = (Button) this.findViewById(R.id.bu_language_change);
        
        editButtonConfirm.setOnClickListener(new OnClickListener() {
Warum findet findViewByID den Button "bu_language_change" nicht? Er wurde doch im Adapter geladen.

Vielen Dank und beste Grüße
0xnull
 
ui_3k1

ui_3k1

Gesperrt

Hallo,
ich sehe nicht, dass der im Adapter geladen wurde. Du lädst den Button doch in deiner editLanguage-Methode, oder sehe ich das falsch?
 
0

0xnull

Neues Mitglied
Im Adapter "inflate" ich die entsprechende Zeile.

Code:
case EDIT_LINE:
               convertView = LayoutInflater.from(getContext()).inflate(R.layout.language_row_edit, null);
In language_row_edit.xml ist der Button definiert.

Der ursprüngliche Beitrag von 19:05 Uhr wurde um 20:00 Uhr ergänzt:

Bin gerade mal im Debugger die App durchgegangen und ich habe den Eindruck, dass notifyDataSetChanged irgendwie nicht die getView Methode meines Adapters aufruft. Wie kann das sein?
 
0

0xnull

Neues Mitglied
Anscheinend wird getView erst nach dem Ende von "onContextItemSelected" aufgerufen? Dann ist natürlich der Button in editLanguage() noch nicht definiert. Aber warum? getView() sollte doch durch notifyDataSetChanged() ausgelöst werden.