¿Cómo inicio un intento de un OnClickListener

Mi actividad principal extiende ListActivity y muestra una lista. Estoy usando Listitems personalizado definido en una clase llamada DefinitionAdapter. También tengo una clase separada que implemente OnClickListener.

En la clase DefinitionAdapter establezco OnClickListener en ListItems:

public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } ... v.setOnClickListener(new OnItemClickListener(position) ); return v; } 

Se supone que mi OnClickListener personalizado inicia otra actividad.

 public class OnItemClickListener implements OnClickListener extends Activity { private int position; public OnItemClickListener(int p) { position = p; } @Override public void onClick(View v) { Intent intent = new Intent(this, ShowDefinition.class); startActivity(intent); } } 

No estoy seguro de que lo esté haciendo bien. He añadido mi nueva actividad al manifiesto, así como la actividad que amplié el oyente con:

 <activity android:name="ShowDefinition" android:label="@string/app_name"> </activity> <activity android:name="OnItemClickListener" android:label="@string/app_name"> </activity> 

Sin embargo, si hago clic en un elemento de mi lista, la aplicación siempre se rompe con una excepción NullPointerException. Creo que estoy usando la intención equivocada … ¿Ideas?

En cuanto al comentario de Nikita Beloglazov:

Se rompe cuando creo el Propósito:

 Intent intent = new Intent(this, ShowDefinition.class); 

Aquí está el stacktrace:

 05-23 22:56:46.629: ERROR/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception 05-23 22:56:46.659: ERROR/AndroidRuntime(258): java.lang.NullPointerException 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.ComponentName.<init>(ComponentName.java:75) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.Intent.<init>(Intent.java:2551) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.andiandy.juradefinitions.OnItemClickListener.onClick(OnItemClickListener.java:22) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.performClick(View.java:2364) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.onTouchEvent(View.java:4179) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.dispatchTouchEvent(View.java:3709) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.os.Handler.dispatchMessage(Handler.java:99) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.os.Looper.loop(Looper.java:123) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.app.ActivityThread.main(ActivityThread.java:4363) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at java.lang.reflect.Method.invokeNative(Native Method) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at java.lang.reflect.Method.invoke(Method.java:521) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 05-23 22:56:46.659: ERROR/AndroidRuntime(258): at dalvik.system.NativeStart.main(Native Method) 

    Su OnItemClickListener no debe extender la actividad. En su lugar, debe disponer que el OnItemClickListener tenga acceso a su instancia de ListActivity. Cualquier vista que ya forme parte de la actividad (como ListView) tiene acceso a la instancia getContext() través de getContext() . A continuación, ejecute onClick como este:

     @Override public void onClick(View v) { Intent intent = new Intent(context, ShowDefinition.class); context.startActivity(intent); } 

    Hay dos maneras de implementar un onItemClickListener. No es necesario crear una nueva clase. Tal vez usted puede probarlo de la manera más fácil por ahora 🙂

    Haga que su ListActivity implemente AdapterView.OnItemClickListener

     public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener 

    A continuación, en el onCreate de ListActivity, configure su onClickListener de la siguiente manera:

      ListView lstvwContacts = getListView(); lstvwContacts.setOnItemClickListener(this); 

    Y entonces usted puede reaccionar al clic como esto:

     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { switch (parent.getId()) { case android.R.id.list: { Log.v(TAG, "onItemClick"); Intent intent = new Intent(this, ShowDefinition.class); startActivity(intent); } } } 

    Eso debería hacerlo por los clics. Si necesita saber cuándo se selecciona un elemento, puede ver AdapterView.OnItemSelectedListener

    -I_Artista

    Su concepción es incorrecta, su OnItemClickListener no debe extender la actividad y usted no debe construir un nuevo onClickListener cada vez.

     public class MainActivity extends Activity { OnItemClickListener = null; MainActivity() { //Build your OnItemClickListener with a valid context OnItemClickListener = new OnItemClickListener(this); } public View getView(int position, View convertView, ViewGroup parent) { ... //Here user the OnItemClickListener } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.