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.
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.