Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
53 views
in Technique[技术] by (71.8m points)

java - Data duplication after SwipeRefreshLayout

I have added a SwipeRefreshLayout in my Activity to update the table in case of need, but I have had a problem that is the following. When I do the Swipe, for some reason the table is duplicated. This is my xml:

<LinearLayout
    android:layout_marginTop="10dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefresh"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TableLayout
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:id="@+id/tabla"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </TableLayout>
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>

And so I apply it in my Activity:

public class ListaPreciosActivity extends AppCompatActivity {
    private SwipeRefreshLayout recarga;

    @Override
protected void onCreate(Bundle savedInstanceState) { //onCreate dibuja los elementos
    super.onCreate(savedInstanceState);
    //getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    setContentView(R.layout.activity_lista_precios);

    traerFecha(ListaPreciosActivity.this);
    fechaHoyMetodo();
    parsearFechasYValidar(ListaPreciosActivity.this);

    //botones
    carga = (Button)findViewById(R.id.btnCargarPrecio);
    cerrar = (Button)findViewById(R.id.btnCerrar);
    recarga = (SwipeRefreshLayout)findViewById(R.id.swipeRefresh);
    listaPreciosPapa();

    recarga.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    listaPreciosPapa();
                    recarga.setRefreshing(false);
                }
            }, 2000);
        }
    });

    //evento para cerrar sesión
    cerrar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            cerrarSesion(); //método
            new PreferenciaLogin(ListaPreciosActivity.this).guardarValor(0); //almacena el valor en la preferencia
            ListaPreciosActivity.this.finish();//cierra la actividad
        }
    });

    //evento para cargar precio
    carga.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //método para cargar precio
            cargarPrecio();
        }
    });
}

    private void listaPreciosPapa() {//método que nos trae los precios
    //stringrquest para traer los datos del php
    //lo ideal sería parsear el array
    recarga.setRefreshing(true);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, "url",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Tabla tabla = new Tabla(ListaPreciosActivity.this, (TableLayout)findViewById(R.id.tabla));
                    tabla.agregarCabecera(R.array.cabecera_tabla);
                    try {//try para atrapar errores si es que los hay
                        JSONArray jsonArray = new JSONArray(response);//creamos un array que dibuja los datos del php
                        for (int i = 0; i < jsonArray.length(); i++) {//ciclo para ya saben qué
                            JSONObject jsonObject1 = jsonArray.getJSONObject(i);//creamos un JSON objeto
                            //le agregamos los campos pertinentes, requisito funciona: nombre de los campos de la bd
                            String zona = jsonObject1.getString("nombreZona");
                            String premin = jsonObject1.getString("precioMinimo");
                            String premax = jsonObject1.getString("precioMaximo");
                            String prom = jsonObject1.getString("promedio");

                            //probando la tabla

                            ArrayList<String> elementos = new ArrayList<String>();
                            zona = zona.replaceAll(" ", "
");
                            elementos.add(zona);
                            elementos.add(premax);
                            elementos.add(premin);
                            elementos.add(prom);

                            tabla.agregarFilaTabla(elementos);

                            recarga.setRefreshing(false);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();//captamos el error
                        recarga.setRefreshing(false);
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            recarga.setRefreshing(false);
        }
    });//same bug, different error
    RequestQueue requestQueue = Volley.newRequestQueue(ListaPreciosActivity.this); //esto ya fue explicado
    requestQueue.add(stringRequest);
}

Tabla class:

public class Tabla {
    // Variables de la clase

    private TableLayout tabla;          // Layout donde se pintará la tabla
    private ArrayList<TableRow> filas;  // Array de las filas de la tabla
    private Activity actividad;
    private Resources rs;
    private int FILAS, COLUMNAS;        // Filas y columnas de nuestra tabla

    /**
     * Constructor de la tabla
     * @param actividad Actividad donde va a estar la tabla
     * @param tabla TableLayout donde se pintará la tabla
     */
    public Tabla(Activity actividad, TableLayout tabla)
    {
        this.actividad = actividad;
        this.tabla = tabla;
        rs = this.actividad.getResources();
        FILAS = COLUMNAS = 0;
        filas = new ArrayList<TableRow>();
    }

    /**
     * A?ade la cabecera a la tabla
     * @param recursocabecera Recurso (array) donde se encuentra la cabecera de la tabla
     */
    public void agregarCabecera(int recursocabecera)
    {
        TableRow.LayoutParams layoutCelda;
        TableRow fila = new TableRow(actividad);
        TableRow.LayoutParams layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
        fila.setLayoutParams(layoutFila);

        String[] arraycabecera = rs.getStringArray(recursocabecera);
        COLUMNAS = arraycabecera.length;

        for(int i = 0; i < arraycabecera.length; i++)
        {
            TextView texto = new TextView(actividad);
            layoutCelda = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, 100);
            texto.setText(arraycabecera[i]);
            texto.setGravity(Gravity.CENTER_HORIZONTAL);
            texto.setTextAppearance(actividad, R.style.estilo_celda);
            texto.setBackgroundResource(R.drawable.tabla_celda_cabecera);
            texto.setLayoutParams(layoutCelda);
            fila.addView(texto);
        }
        tabla.addView(fila);
        filas.add(fila);
        FILAS++;
    }

    /**
     * Agrega una fila a la tabla
     * @param elementos Elementos de la fila
     */
    public void agregarFilaTabla(ArrayList<String> elementos)
    {
        TableRow.LayoutParams layoutCelda;
        TableRow.LayoutParams layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        TableRow fila = new TableRow(actividad);
        fila.setLayoutParams(layoutFila);

        for(int i = 0; i< elementos.size(); i++)
        {
            TextView texto = new TextView(actividad);
            texto.setText(String.valueOf(elementos.get(i)));
            texto.setGravity(Gravity.CENTER);
            texto.setTextAppearance(actividad, R.style.estilo_celda);
            texto.setBackgroundResource(R.drawable.tabla_celda);
            layoutCelda = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
            texto.setLayoutParams(layoutCelda);
            fila.addView(texto);
        }
        tabla.addView(fila);
        filas.add(fila);
        FILAS++;
    }

    /**
     * Elimina una fila de la tabla
     * @param indicefilaeliminar Indice de la fila a eliminar
     */
    public void eliminarFila(int indicefilaeliminar)
    {
        if( indicefilaeliminar > 0 && indicefilaeliminar < FILAS )
        {
            tabla.removeViewAt(indicefilaeliminar);
            FILAS--;
        }
    }

    /**
     * Devuelve las filas de la tabla, la cabecera se cuenta como fila
     * @return Filas totales de la tabla
     */
    public int getFilas()
    {
        return FILAS;
    }

    /**
     * Devuelve las columnas de la tabla
     * @return Columnas totales de la tabla
     */
    public int getColumnas()
    {
        return COLUMNAS;
    }

    /**
     * Devuelve el número de celdas de la tabla, la cabecera se cuenta como fila
     * @return Número de celdas totales de la tabla
     */
    public int getCeldasTotales()
    {
        return FILAS * COLUMNAS;
    }

    /**
     * Obtiene el ancho en píxeles de un texto en un String
     * @param texto Texto
     * @return Ancho en píxeles del texto
     */
    private int obtenerAnchoPixelesTexto(String texto)
    {
        Paint p = new Paint();
        Rect bounds = new Rect();
        p.setTextSize(50);

        p.getTextBounds(texto, 0, texto.length(), bounds);
        return bounds.width();
    }
}

Demo without swipe:

enter image description here

Demo after Swipe:

enter image description here

Does anyone know what I'm doing wrong?

question from:https://stackoverflow.com/questions/65833316/data-duplication-after-swiperefreshlayout

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You have to remove old data from table than implement new data

There's a stackoverflow question

myLinearLayout.someTableView.removeAllViews()

I think for you the code should be

tabla.removeAllViews()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...