NullpointerException bei dynamischen Button

0

0xnull

Neues Mitglied
0
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
 
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?
 
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?
 
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.
 

Ähnliche Themen

A
  • AnimaAngelo85
Antworten
1
Aufrufe
337
swa00
swa00
MES
Antworten
10
Aufrufe
820
MES
MES
D
Antworten
17
Aufrufe
409
datNeMo
D
Zurück
Oben Unten