Android ListView múltiples matrices con adaptador personalizado

He extraído un par de matrices json de un DB, estos son los arrays (Name = una lista de nombres, dirección = una lista de enteros) y alojados en DialerFragment:

String[] contactNameArray= LoginHandler.getMyName(); String[] contactAddressArray= LoginHandler.getMyContactsAddress(); ListAdapter contactadapter = new ContactsAdapter(getActivity(), contactNameArray); ListView contactsListView = (ListView) view.findViewById(R.id.contact_list); contactsListView.setAdapter(contactadapter); 

Aquí está mi ContactsAdapter:

 public class ContactsAdapter extends ArrayAdapter<String>{ private static final String TAG = "ContactsListAdapter"; public ContactsAdapter(Context context, String[] values){ super(context, R.layout.contact_row_layout, values); } @Override public View getView(int position, View convertView, ViewGroup parent){ Log.d(TAG, "getView"); // The LayoutInflator puts a layout into the right View LayoutInflater inflater = LayoutInflater.from(getContext()); // inflate takes the resource to load, the parent that the resource may be // loaded into and true or false if we are loading into a parent view. View view = inflater.inflate(R.layout.contact_row_layout, parent, false); // We retrieve the text from the array String contact = getItem(position); // Get the TextView we want to edit TextView mContactName = (TextView)view.findViewById(R.id.contact_name); view.findViewById(R.id.contacts_avatar); // Put the next TV Show into the TextView mContactName.setText(contact); return view; }} 

Además, dentro de mi DialerFragment tengo este código:

 private final View.OnClickListener mOnMakeCallClick = new OnClickListener(){ public void onClick(final View view){ String numberToCall = "2"; if (!TextUtils.isEmpty(numberToCall)){ mCallWithVideo = view.getId() == R.id.contact_videocall; Log.d(TAG, "make call clicked: " + numberToCall + ", video=" + (mCallWithVideo ? "true" : "false")); mCallInitiated = ((Main)getActivity()).makeCall(numberToCall, mCallWithVideo); mTelNumberView.setText(""); } } }; 

Tengo ListView (fragment_dialer.xml) y la plantilla de fila (contact_row_layout.xml).

El código actualmente funciona sin errores, rellenando el ListView con los contactos que tengo en mi base de datos.

El problema: necesito llamar dinámicamente a los contactos dependiendo de qué ImageButton se ha hecho clic. es decir, ¿Cómo puedo hacer coincidir una matriz de nombres con una matriz de direcciones y luego pasar esa dirección a OnCallClick para iniciar la llamada? Sería bueno si pudiera asignar el valor de ImageButton (como harías algo similar en PHP) y luego llamar a ese "valor" dentro del contactsadapter.

Estoy realmente muy atascado en esto, cualquier ayuda sería muy apreciada. También soy bastante nuevo para Android.

Solución: DialerFragment:

 ListView contactsListView = (ListView) view.findViewById(R.id.contact_list); contactsListView.setAdapter(new ContactsBaseAdapter(getActivity())); 

Entonces mi clase de "una sola fila":

 class SingleRow{ String name; String address; SingleRow(String name, String address){ this.name=name; this.address=address; }} 

Entonces mi "adaptador de base de contactos":

 public class ContactsBaseAdapter extends BaseAdapter{ private static final String TAG = "CONTACTS_BASE_ADAPTER"; ArrayList<SingleRow> list; Context context; ContactsBaseAdapter(Context c){ list = new ArrayList<SingleRow>(); context = c; String[] contactNameArray= LoginHandler.getMyName(); String[] contactAddressArray= LoginHandler.getMyContactsAddress(); for(int i= 0; i< contactNameArray.length; i++){ list.add(new SingleRow(contactNameArray[i], contactAddressArray[i])); } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View row = inflater.inflate(R.layout.contact_row_layout,parent, false); ImageView mContactPresence = (ImageView)row.findViewById(R.id.contacts_avatar); TextView mContactName = (TextView)row.findViewById(R.id.contact_name); TextView mContactAddress = (TextView)row.findViewById(R.id.contact_number); SingleRow contactrow = list.get(i); mContactName.setText(contactrow.name); mContactAddress.setText(contactrow.address); Drawable drawable = null; mContactPresence.setImageDrawable(drawable); return row; }} 

Notas: Usted estaba bien gracias. Mi problema era que era completamente nuevo para este tipo de programación. Yo había hecho OOP antes, pero sólo en PHP y no sabía cómo manipular datos como que dentro de android. ¡Pulgares a todos los que me apuntaron en la dirección correcta, aprendí mucho! También, encontré esta lista de reproducción de videos de youtube que me ayudó a entender muchos de los fundamentos de listviews y adaptadores, etc.

Siguiente: Estaré mirando ViewHolders y RecyclerViews para optimizar el código :). y para pasar los datos en un controlador de llamadas junto con la presencia!

2 Solutions collect form web for “Android ListView múltiples matrices con adaptador personalizado”

Por lo tanto, crear un objeto llamado Contacto, añadir atributos, después de que en el diseño del adaptador, añada las TextView que desea y simplemente llamarlas al establecer el número, nombre, etc Mira a continuación.

public class ContactsAdapter extends ArrayAdapter {privado static final String TAG = "ContactsListAdapter";

 public ContactsAdapter(Context context, String[] values){ super(context, R.layout.contact_row_layout, values); } @Override public View getView(int position, View convertView, ViewGroup parent){ Log.d(TAG, "getView"); // The LayoutInflator puts a layout into the right View LayoutInflater inflater = LayoutInflater.from(getContext()); // inflate takes the resource to load, the parent that the resource may be // loaded into and true or false if we are loading into a parent view. View view = inflater.inflate(R.layout.contact_row_layout, parent, false); // We retrieve the text from the array // Get the TextView we want to edit //Create more textviews for showing desired atributes TextView mContactName = (TextView)view.findViewById(R.id.contact_name); TextView mContactNumber = (TextView) view.findViewById(R.id.contact_number); view.findViewById(R.id.contacts_avatar); //Create object contact that will have name, number, etc atributes... Contact contact = getItem(position); // Put the next TV Show into the TextView mContactName.setText(contact.getName()); mContactNumber.setText(contact.getNumber()); return view; 

Recomendaría hacer una nueva matriz de un nuevo objeto (Contacto) que se rellenaría de sus matrices existentes contactNameArray y contactAddressArray.

  Contact { public String name; public String address; } 

Transmitir esta matriz a ContactsAdapter.

En su implementación de AdapterView.onItemClick, simplemente llamaría

  contactadapter.getItem(position); 

Con el fin de obtener su objeto de contacto asociado con la fila de clic.

Como nota adicional, recomiendo encarecidamente implementar el patrón ViewHolder estático en su getView ( https://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html ).

  • Conjunto de datos grande con ArrayAdapter y ListView en Android
  • Cambiar la imagen de fondo de una actividad que extiende ListActivity
  • ListView de Android con casilla de verificación Eliminar / obtener ID de fila
  • Cómo filtrar ListView a través de EditText
  • Problema de menú emergente en Android ListView
  • Vista de lista personalizada con encabezados personalizados Android
  • Establecer oyente de clic largo para listview
  • Android Action Bar Search: ¿Cómo filtrar una lista por la propiedad de un elemento de la lista?
  • Frontera de elementos de listview en android
  • Android ListView agrega elementos a la parte superior sin vista de lista desplácese
  • Me gusta saber cómo obtener el elemento seleccionado en la lista expandible ANDROID
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.