Devolución de llamada desde el adaptador
Así que tengo un listview personalizado. Es como el diseño de Instagram con una imagen y un montón de botones en cada elemento de la lista. Así que aquí está el problema:
Quiero implementar el botón de compartir. Para hacer esto, intenté crear una devolución de llamada del adaptador a la actividad. Pero no parecía funcionar. Esto es lo que tengo hasta ahora (he recortado las partes no relacionadas):
- Problemas de serialización java con JVM diferentes
- ¿Cómo puedo establecer una conexión con DVR y decodificar los datos?
- AndroidHttpClient y DefaultHttpClient
- ¿Por qué no están dibujando mis puntos de vista?
- LIBGDX ¿Es mejor usar spritesheet o imágenes individuales?
Actividad principal
public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ ListView main_list; List<String> url_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_list = (ListView) findViewById(R.id.listView); ListAdapter nListAdapter = new ListAdapter(context, url_list); main_list.setAdapter(nListAdapter); } @Override public void ShareClicked(String url) { Log.e("Test",url); } }
ListAdapter
public class ListAdapter extends BaseAdapter implements View.OnClickListener { OnShareClickedListener mCallback; Context context; public static List<String> url_list; public ListAdapter(Context c, List<String> list) { this.context = c; url_list = list; } public interface OnShareClickedListener { public void ShareClicked(String url); } @Override public void onClick(View v) { mCallback.ShareClicked("Share this text."); } } }
Registro de errores:
Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference
- ¿Cómo implementar la funcionalidad de la cámara con opciones adicionales (como Panorama)?
- Java REST cliente API para Android
- ¿Qué es alertcontroller.recyclelistview
- Android: Carga de una foto en Cloudinary con devolución de llamada de progreso en HttpURLConnection
- Conexión XMPP con Smack 4.1 en Android Studio
- Libgdx para Android muestra negro antes de la pantalla principal
- Android: no se puede iniciar la intención de servicio: ¿no se encuentra?
- Javax.net.ssl.SSLException: Conexión cerrada por peer en el dispositivo 4.4.2 (funciona en 6.0.1)
Debe indicar al adaptador qué implementación de OnShareClickedListener () utilizar. Ahora en su adaptador el campo mCallback nunca está asignado a, o bien necesita tener un método setOnSharedClickedListener () en su adaptador que luego llama desde mainActivity y lo establece con la implementación de la actividad principal o necesita tener en el constructor.
Mi sugerencia sería usar un setter en lugar de un constructor. Así que lo que tienes que hacer es esto.
Tu ListAdapter
public class ListAdapter extends BaseAdapter implements View.OnClickListener { OnShareClickedListener mCallback; Context context; public static List<String> url_list; public ListAdapter(Context c, List<String> list) { this.context = c; url_list = list; } public void setOnShareClickedListener(OnShareClickedListener mCallback) { this.mCallback = mCallback; } public interface OnShareClickedListener { public void ShareClicked(String url); } @Override public void onClick(View v) { mCallback.ShareClicked("Share this text."); } }
Su MainActivty
public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ ListView main_list; List<String> url_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_list = (ListView) findViewById(R.id.listView); ListAdapter nListAdapter = new ListAdapter(this, url_list); nListAdapter.setOnShareClickedListener(this); main_list.setAdapter(nListAdapter); } @Override public void ShareClicked(String url) { Log.e("Test", url); } }
- Cómo guardar el estado de actividad en android?
- Ionic platform add android Comando fallado con exit code ENOENT