OnEditorActionListener für Elemente einer ListView-Zeile

W

Wicki12

Ambitioniertes Mitglied
0
Hallo,

ich habe eine ListView, in der jede Zeile 2 Elemente vom Typ EditText enthält. Mein Problem: Ich möchte einen OnEditorAction-Listener für diese Elemente setzen. Wenn ich das jedoch in meiner Activity mit 'findViewById' mache erhalte ich immer eine Nullpointer-Referenz. Ist ja auch klar, da diese Elemente ja innerhalb der ListView liegen und zu diesem Zeitpunkt nicht verfügbar sind.
Wann wo und wie muss ich den Listener zuweisen ?
Danke für Eure Bemühungen im voraus.

Gruß Wicki
 
das macht man im getView des Adapters.
 
besten Dank. Die Listener konnte ich nun bei den ListView-Elementen registrieren. Aber der Listener wird nicht aufgerufen, egal was ich mit dem EditText mache. Zumindest die 1. Anweisung des Listeners sollte aufgerufen werden. Im Layout ist android:imeOptions="actionSend" gesetzt.
Code:
   View vv =adapter.getView(0, null, listView);
   EditText bn=(EditText)vv.findViewById(R.id.textViewBook);
   EditText bw=(EditText)vv.findViewById(R.id.textViewWriter);
   String s = bw.getText().toString(); //zeigt richtigen Wert der 1. Zeile an
   bn.setOnEditorActionListener(this);
   bw.setOnEditorActionListener(this);
   .
   .
  public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
        if (arg1 == EditorInfo.IME_ACTION_SEND) {
            String z1=(String) arg0.getText();
        }
      return false;
  }
Woran kann das liegen ?
 
Nein, so meinte ich das nicht (wo zum Henker rufst du den Code auch auf)?

Der Adapter erzeugt für den ListView für jede Zeile einen View in getView(). Der ListView ruft getView auf und nicht du! :D

Wenn du nun einen eigenen Adapter schreibst, kannst du in getView deine Listener ankoppeln.

Typischerweise geht das so:

Code:
class myAdapter extends SystemAdapterMeinerWahl {
...
@Override
public View getView( .... ) {
   View vv = super.getView( .... );
   // hier kannst du den findView/setOnEditActionAdapter machen.
}

Das ist jetzt so noch nicht fertig, denn der ListView kann auch Views recyclen, d.h. getView bekommt einen alten View übergeben und erzeugt vielleicht garkeinen neuen, wenn man dann stumpf Views und Listener erzeugt, ist das nicht gut für den Speicherbedarf deiner App.
 
Dank für Deine Mühe. Inzwischen war mir klar, dass ich einen eigenen Adapter schreiben und darin getView neu implementieren muss. Jetzt wird auch der Listener aufgerufen. Allerdings habe ich nun ein anderes Problem.
Die Daten werden in den EditText-Elementen nicht mehr angezeigt. Der Listener wird aufgerufen, wenn ich was eingebe und mit Enter abschliesse.
Wenn ich statt MySimpleCursorAdapter einen originalen SimpleCursorAdapter nehme, werden die Daten angezeigt aber dann habe ich ja keine eigene getView-Methode und um die geht es mir ja.

Code:
   cursor = accessDb.createListViewCursor(table, columns, order);
   adapter = new MySimpleCursorAdapter(this, layoutView, cursor, 
                 displayColumns, displayViews);
   listView.setAdapter(adapter);
   .
   .
class MySimpleCursorAdapter extends SimpleCursorAdapter {
   public MySimpleCursorAdapter(Activity context, int layout, Cursor c,
        String[] from, int[] to) {
      .
      .
    }

     @Override
     public View getView(int position, View convertView, ViewGroup parent){ 
       super.getView(position, convertView, parent);
       LayoutInflater inflator = context.getLayoutInflater();
       View rowView;
        rowView = inflator.inflate(R.layout.bookrecord, null);
        EditText bn = (EditText) rowView.findViewById(R.id.textViewBook);
        EditText bw = (EditText)  rowView.findViewById(R.id.textViewWriter);
        bn.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            .
            .
            return true;
        }
      });
     }
}
Kannst Du mir auch hier noch helfen ?
Ich stehe schon ganz schön in Deiner Schuld...

Gruß Wicki

Der ursprüngliche Beitrag von 22:32 Uhr wurde um 23:17 Uhr ergänzt:

Kommando zurück. Fehler gefunden.
Die getView muss noch ergänzt werden durch:
Code:
      .
      .
      int k1 = cursor.getColumnIndex("bookname");
      int k2 = cursor.getColumnIndex("writer");
      bn.setText(cursor.getString(k1));
      bw.setText(cursor.getString(k2));
      return rowView;
Dadurch werden die beiden Elemente der Quelle (Cursor) an die rowView gebunden.
Das ist jetzt so noch nicht fertig, denn der ListView kann auch Views recyclen, d.h. getView bekommt einen alten View übergeben und erzeugt vielleicht garkeinen neuen, wenn man dann stumpf Views und Listener erzeugt, ist das nicht gut für den Speicherbedarf deiner App.
Kannst Du mir das nochmal genauer erläutern ?

Gruß Wicki
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Wicki12
Habe das nun soweit hingekriegt, dass die Tabellenzeilen in der ListView geändert, gelöscht bzw. eine neue Zeile hinzugefügt werden kann.
Nochmals danke.

Gruss Wicki
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.006
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
449
jogimuc
J
L
Antworten
4
Aufrufe
1.316
lonnie9020
L
Zurück
Oben Unten