Curso de Android | Como crear una lista (ItemList)

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Qué es una Lista

Una lista en el contexto de Activity es la interfaz gráfica que nos permite navegar por una serie de datos.

Curso de Android | Como crear una lista (ItemList) 1

Usando ArrayAdapter

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_oooooooooooooo);
        ArrayList<String> palabras = new ArrayList<String>();
        palabras.add("amor");
        palabras.add("cariño");
        palabras.add("pasión");

        ListView lv = findViewById(R.id.miLista);

        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, palabras));
    }

Usando RecyclerView

RecyclerView rv =  findViewById(R.id.miLista);
String [] paises = getResources().getStringArray(R.array.countries);
MyAdapter myAdapter = new MyAdapter(this, paises);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setHasFixedSize(true);
rv.setAdapter(myAdapter);
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolderPais> {

//El ViewHolder es la fila. En el constructor del ViewHolderPlanta accedemos a los objetos
//de la fila mediante código Java
public static class ViewHolderPais extends RecyclerView.ViewHolder {
	TextView tv;
	private View.OnClickListener onItemClickListener;

	public ViewHolderPais(@NonNull View itemView) {
		super(itemView);
		tv = itemView.findViewById(R.id.tv);
	}
}

private String[] paises;
private Context context;

public MyAdapter(@NonNull Context context, String [] paises) {
	this.paises = paises;
	this.context = context;
}

//En el constructor del ViewHolder inflamos el xml
@NonNull
@Override
public ViewHolderPais onCreateViewHolder(@NonNull ViewGroup parent, int position) {
	LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
	View row = layoutInflater.inflate(R.layout.simple_row_list,parent,false);
	ViewHolderPais viewHolder = new ViewHolderPais(row);
	viewHolder.itemView.getTag();
	return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolderPais viewHolder, int position) {
	final String pais = paises[position];
	viewHolder.tv.setText(pais);
}

@Override
public int getItemCount() {
	return paises.length;
}
}
res/values/countries.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<string-array name="countries">
		<item name="usa">United States</item>
		<item name="brazil">Brazil</item>
		<item name="russia">Russia</item>
		<item name="egypt">Egypt</item>
		<item name="japan">Japan</item>
	</string-array>
</resources>

Content Provider

Nos permiten acceder a la información de otras aplicaciones incluida en un dispositivo, por ejemplo, a la agenda telefónica.

En un content provider los datos pueden estar almacenados:

  • en una base de datos.
  • en archivos.
  • en una red.

Cómo acceder a los contactos

Para leer los contactos, primero habrá que añadir uno:
Símbolo del teléfono → botón de menú → Add contact.

Añadimos el permiso justo antes del cierre del Manifest:
<uses-permission android:name = «android.permission.READ_CONTACTS» />

Obtener los teléfonos

Para recuperar los contactos:
private ArrayList getContactos(){
	ContentResolver cr = getContentResolver();
	Cursor contactos = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
	String phoneNo = "";
	ArrayList listaContactos = new ArrayList();
	int n = contactos.getCount();

	if (contactos.getCount() > 0) {
		while (contactos.moveToNext()) {
			String id = contactos.getString(contactos.getColumnIndex(ContactsContract.Contacts._ID));
			String name = contactos.getString(contactos.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
			if (Integer.parseInt(contactos.getString(contactos.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
				Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
				ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = ?", new String[] { id }, null);
				while (pCur.moveToNext()) {
					phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
					listaContactos.add(new Contacto(name, phoneNo));
				}
				pCur.close();
			}
		}
	}
	return listaContactos;
}
Para solicitar los permisos de acceso a los contactos:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
	if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
		ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
	}else{
		contactosList = getContactos();
	}
}else{
	contactosList = getContactos();
}

...

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
	switch (requestCode) {
		case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
			// If request is cancelled, the result arrays are empty.
			if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
				contactosList = getContactos();
			} else {
				// permission denied, boo! Disable the
				// functionality that depends on this permission.
			}
			return;
		}
		// other 'case' lines to check for other
		// permissions this app might request
	}
}

Ejercicio: Recuperar contactos

Recuperar los contactos del teléfono y mostrarlos en un RecyclerView

CardView

implementation 'androidx.cardview:cardview:1.0.0'
<androidx.cardview.widget.CardView
	...
	android:layout_margin="4dp"

	app:cardCornerRadius="60dp"
	app:cardElevation="40dp"
	app:cardMaxElevation="60dp"
>

Ejercicio: Cardview

Utilizar un CardView para maquetar cada una de las filas del contenido cargado con un RecyclerAdapter.

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.