2014-10-02 15 views
5

Ho un ListView popolato da un adattatore personalizzato. Ogni riga contiene 1 pulsante. Nel xml il pulsante ha l'attributo onClick passato. Ho solo l'xml, non un insieme di OnClickListeners. Notare anche che il vuoto pubblico myMethod (View v) esiste nel mio CustomActivity. Ottengo la seguente eccezioneAndroid non trova il metodo dal pulsante onClick in ListView Row

10-02 03:01:46.463: E/AndroidRuntime(26857): java.lang.IllegalStateException: Could not find a method myClickHandler(View) in the activity class **android.app.Application** for onClick handler on view class android.widget.Button with id 'myButton' 

Metodo in attività:

public void myClickHandler(View v) { 
    ... do stuff here... 
} 

Pulsante XML:

 <Button 
      android:id="@+id/myButton" 
      android:layout_width="44dp" 
      android:layout_height="44dp" 
      android:background="@drawable/eye_icon" 
      android:onClick="myClickHandler" 
      /> 

Una nota interessante nel eccezione è che l'applicazione cerca di trovare il metodo in android.app.Application e non nella mia attività personalizzata.

Qualche suggerimento?

risposta

3

È importante che MyActivity e getContext() di CustomAdapter devono essere la stessa istanza. Confronta il tuo con il mio.

miei codici:

MyActivity.java

public class MyActivity extends Activity { 
    public static final String TAG = "MyActivity"; 
    private ListView mListView; 
    private CustomAdapter mAdapter; 
    private ArrayList<String> mData; 

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

     mListView = (ListView) findViewById(R.id.listView); 

     mData = new ArrayList<String>(); 
     mData.add("111"); 
     mData.add("222"); 
     mData.add("333"); 
     mData.add("444"); 
     mData.add("555"); 

     mAdapter = new CustomAdapter(this, R.layout.list_item_view, mData); 
     mListView.setAdapter(mAdapter); 
    } 

    public void onClickHandler(View view) { 
     Log.i(TAG, "onClickHandler()"); 
    } 
} 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String> { 

    public CustomAdapter(Context context, int resource, ArrayList<String> objects) { 
     super(context, resource, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_item_view, null); 
     } 

     return convertView; 
    } 
} 

activity_my.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MyActivity"> 

    <ListView 
     android:id="@+id/listView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

list_item_view.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:id="@+id/button" 
     android:onClick="onClickHandler"/> 
</LinearLayout> 
+0

Hai ragione anche se avevo già trovato la risposta. Ho passato il risultato "getApplicationContext()" nell'adattatore invece della mia attività personalizzata ... Grazie mille – Panos

1

Suppongo che abbiate scritto un adattatore personalizzato per questa vista così nell'adattatore quando chiamate getView semplicemente findElementById sul pulsante e impostate onClickListener.

+0

Probabilmente non è sicuro assumere che l'OP abbia già scritto un adattatore personalizzato. Tuttavia, suggerire che lo faccia sembra una buona idea per me. –

0

Questo è un esempio del motivo per cui l'attributo onClick è considerato danneggiato. Probabilmente è meglio creare un adattatore personalizzato e nel metodo getView(), impostare manualmente lo OnClickListener.

3

Durante la creazione dell'abitudine Adapter, stavo passando come Context il risultato del metodo getApplicationContext(). Questo era sbagliato. Devo passare this (la mia personalizzata Activity) come Context. Funziona come un fascino ora.

Problemi correlati