Cómo crear una aplicación para Android que guarde objetos personalizados de forma persistente | de pandaquests | Noviembre de 2020

En casi todas las aplicaciones es necesario guardar de forma persistente la información personalizada en la aplicación y luego cargarla y mostrársela al usuario. Desafortunadamente, Android no le proporciona esta funcionalidad lista para usar. Por lo tanto, en este tutorial le mostraré cómo crear una aplicación que guarde objetos personalizados de manera persistente con gson.

Foto de Rami Al-zayat en Unsplash

Las tecnologías que utilizaré son las siguientes:

  • Estudio de Android
  • androide 28
  • gson
  • gradle

Este artículo se basa principalmente en este punto.S.t. Pero como algunas API han cambiado, no podrá crear una aplicación si sigue el tutorial mencionado anteriormente. Me tomó un tiempo hacerlo funcionar. Para ahorrarle tiempo, creo este tutorial para usted. También he agregado información adicional que no se mencionó en mi publicación de referencia mencionada anteriormente y que puede ser útil para principiantes.

Primero cree una nueva aplicación a través de Android Studio, seleccione la plantilla de aplicación en blanco y asígnele un nombre, por ejemplo MyApplication. Luego agregue las siguientes dependencias en su archivo build.gradle archivo:

dependencies {
implementation 'com.android.support:design:28.0.+'
implementation 'com.google.code.gson:gson:2.8.5'
}

Necesitamos algunos diseños para nuestra interfaz de usuario que no son proporcionados por el SDK estándar de Android. Entonces, debemos agregar la adicción al diseño:
implementación com.android.support:design:28.0+

Google le proporciona métodos gson que puede utilizar para serializar y deserializar objetos java: https://github.com/google/gson

Eso sí, el número 28 en ex com.android.support:design:28.9.+ hace referencia a la versión del SDK de destino. asegúrese de que sean siempre el mismo número. En mi ejemplo es 28. El tuyo puede ser diferente. Para saber qué versión de destino está utilizando, también puede comprobar la suya gradle-archivo:

android {
compileSdkVersion 28
defaultConfig {
...
targetSdkVersion 28
...
}
}

Después de agregar las dependencias anteriores, haga clic en «sincronizar» (en la esquina superior derecha) para que Gradle pueda descargar las dependencias necesarias.

El siguiente paso es diseñar nuestro diseño principal. Queremos dos campos de entrada en los que escribir algunos datos (que guardaremos más adelante) y dos botones: Insertar y guardar. El botón Insertar inserta nuestro objeto recién creado en la lista que se muestra en la vista principal. El botón Guardar lo guarda permanentemente en nuestra aplicación. En layout carpeta de escritura dentro del archivo activity_main.xml archivar esto:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="de.pandaquests.myapplication.MainActivity">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="100dp"
android:background="@android:color/darker_gray" />

<EditText
android:id="@+id/edittext_line_1"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="52dp"
android:hint="Line 1" />

<EditText
android:id="@+id/edittext_line_2"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:hint="Line 2" />

<Button
android:id="@+id/button_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/edittext_line_1"
android:layout_marginStart="13dp"
android:layout_marginTop="23dp"
android:layout_toEndOf="@id/edittext_line_1"
android:text="insert" />

<Button
android:id="@+id/button_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/button_insert"
android:layout_toEndOf="@+id/button_insert"
android:text="save" />

</RelativeLayout>

A continuación, creamos la interfaz de usuario para nuestro elemento personalizado. El elemento personalizado representa los datos que ponemos en la lista. Crear en layout carpeta un archivo llamado example_item.xml haciendo clic derecho y seleccionando Nuevo -> Archivo de recursos de diseño. escribir example_item.xml como nombre e ignoraremos el resto, porque sobreescribiremos todo dentro de ese archivo con el siguiente código dentro de él:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp">

<TextView
android:id="@+id/textview_line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Line 1"
android:textColor="@android:color/black"
android:textSize="20sp"
android:textStyle="bold" />

<TextView
android:id="@+id/textview_line_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textview_line1"
android:layout_marginStart="8dp"
android:text="Line 2"
android:textSize="15sp" />

</RelativeLayout>

</androidx.cardview.widget.CardView>

Una vez que hayamos terminado, crearemos la funcionalidad necesaria para nuestro negocio principal. Dentro de MainActivity.java archivo escriba lo siguiente:

package de.pandaquests.myapplication;

import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

ArrayList<ExampleItem> mExampleList;
private RecyclerView mRecyclerView;
private ExampleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

loadData();
buildRecyclerView();
setInsertButton();

Button buttonSave = findViewById(R.id.button_save);
buttonSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveData();
}
});
}

private void saveData() {
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(mExampleList);
editor.putString("task list", json);
editor.apply();
}

private void loadData() {
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<ExampleItem>>() {}.getType();
mExampleList = gson.fromJson(json, type);

if (mExampleList == null) {
mExampleList = new ArrayList<>();
}
}

private void buildRecyclerView() {
mRecyclerView = findViewById(R.id.recyclerview);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mAdapter = new ExampleAdapter(mExampleList);

mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
}

private void setInsertButton() {
Button buttonInsert = findViewById(R.id.button_insert);
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText line1 = findViewById(R.id.edittext_line_1);
EditText line2 = findViewById(R.id.edittext_line_2);
insertItem(line1.getText().toString(), line2.getText().toString());
}
});
}

private void insertItem(String line1, String line2) {
mExampleList.add(new ExampleItem(line1, line2));
mAdapter.notifyItemInserted(mExampleList.size());
}
}

Es probable que vea muchos errores. Pero no se preocupe, es porque todavía faltan archivos. A continuación creamos el archivo ExampleAdapter.java. Cree en la carpeta de su proyecto (la carpeta donde su MainActivity.java archivo es) un archivo llamado ExampleAdapter.java

package de.pandaquests.myapplication;

import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<ExampleItem> mExampleList;

public static class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextViewLine1;
public TextView mTextViewLine2;

public ExampleViewHolder(View itemView) {
super(itemView);
mTextViewLine1 = itemView.findViewById(R.id.textview_line1);
mTextViewLine2 = itemView.findViewById(R.id.textview_line_2);
}
}

public ExampleAdapter(ArrayList<ExampleItem> exampleList) {
mExampleList = exampleList;
}

@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);
ExampleViewHolder evh = new ExampleViewHolder(v);
return evh;
}

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
ExampleItem currentItem = mExampleList.get(position);

holder.mTextViewLine1.setText(currentItem.getLine1());
holder.mTextViewLine2.setText(currentItem.getLine2());
}

@Override
public int getItemCount() {
return mExampleList.size();
}
}

Ahora solo necesitamos nuestro artículo personalizado. Nosotros creamos ExampleItem.java archivo en la carpeta del proyecto y pegue el siguiente código:

package de.pandaquests.myapplication;
public class ExampleItem {
private String mLine1;
private String mLine2;

public ExampleItem(String line1, String line2) {
mLine1 = line1;
mLine2 = line2;
}

public String getLine1() {
return mLine1;
}

public String getLine2() {
return mLine2;
}
}

Ahora deberíamos estar listos. Presiona Ejecutar y deberías ver una aplicación de muestra en funcionamiento que guarda datos personalizados.

Puedes descargar la aplicación completa aquí desde mi gitHub y editarla como quieras. Úselo como base para sus proyectos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *