Custom ListView with database only shows an Android data

1

I'm making an application that should print a list of tasks, the tasks will get them from the database, using a custom ListView with a TextView and a CheckBox. The problem comes when I print the tasks extracted from the database only print 1 of the tasks the last one, since if I enter more tasks when updating only shows the newly entered. I leave the codes, I hope you can help me

//MainActivity.java
package com.example.hermanos.basededatos;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

ListView lv;
public DatosAdapter adapter;
Datos datos[];

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


    lv= (ListView)findViewById(R.id.lista);
    Basededatos n_user = new Basededatos(this,"Registro",null,1);
    SQLiteDatabase bd = n_user.getWritableDatabase();

    String sql="SELECT * FROM tareas";
    Cursor registros= bd.rawQuery(sql,null);
    if(registros.moveToFirst()){
        while(registros.moveToNext()){
            datos= new Datos[]{new Datos(registros.getString(1))};
        }
    }
    View header = (View)getLayoutInflater().inflate(R.layout.list_header_row,null);
    lv.addHeaderView(header);
    adapter = new DatosAdapter(this, R.layout.listview_item_row,datos);
    lv.setAdapter(adapter);


}

public void n_user(View view){
    Intent i = new Intent(this, Main2Activity.class);
    startActivity(i);
}
}


//Datos.java
package com.example.hermanos.basededatos;

public class Datos {

        public String tarea;

        /*public Datos(){
            super();
        }*/

        public Datos(String tarea){
            super();
            this.tarea = tarea;
        }
}
//DatosAdapter.java
package com.example.hermanos.basededatos;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class DatosAdapter extends ArrayAdapter<Datos> {

    Context mycontext;
    int mylayout_resourseID;
    Datos mydata[] = null;

    public DatosAdapter(Context context,int layout_resourseID, Datos[] data){

        super(context,layout_resourseID,data);

        this.mycontext = context;
        this.mylayout_resourseID = layout_resourseID;
        this.mydata = data;

        }

    public View getView(int position, View convertView, ViewGroup parent){
        View row = convertView;
        Datosholder holder = null;

        if(row==null){
            LayoutInflater inflater = ((Activity)mycontext).getLayoutInflater();
            row = inflater.inflate(mylayout_resourseID,parent,false);
            holder = new Datosholder();
            holder.textview = (TextView)row.findViewById(R.id.txt);
            row.setTag(holder);
        }else{
            holder = (Datosholder)row.getTag();
        }

        Datos datos = mydata[position];
        holder.textview.setText(datos.tarea);

        return row;
    }

    static class Datosholder{
        TextView textview;
    }

}
    
asked by Santiago Faverio 22.07.2018 в 16:58
source

1 answer

0

The problem is that in fact you are adding a single element in array data , in the end you would only have a value which is showing in your ListView:

  if(registros.moveToFirst()){
        while(registros.moveToNext()){
            datos= new Datos[]{new Datos(registros.getString(1))};
        }
    }

Actually what you must do is an array of elements type Datos and add within the values obtained from the cursor.

 ...
 ...
 Cursor registros= bd.rawQuery(sql,null);

 //Crea arraylist de objetos tipo Datos.
 List datos = new ArrayList<Datos>();

    if(registros.moveToFirst()){
        while(registros.moveToNext()){
            //datos= new Datos[]{new Datos(registros.getString(1))};

             //Agrega valores al arrayList.
             datos.add(registros.getString(1));
        }
    }
 ...
 ...

now you must also change your Adapter to accept this list of elements and show the value of tarea of each object:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

public class DatosAdapter extends ArrayAdapter<Datos> {

    Context mycontext;
    int mylayout_resourseID;
   //Datos mydata[] = null;
    List mydata;

    public DatosAdapter(Context context, int layout_resourseID, List data){

        super(context,layout_resourseID,data);

        this.mycontext = context;
        this.mylayout_resourseID = layout_resourseID;
        this.mydata = data;

    }

    public View getView(int position, View convertView, ViewGroup parent){
        View row = convertView;
        Datosholder holder = null;

        if(row==null){
            LayoutInflater inflater = ((Activity)mycontext).getLayoutInflater();
            row = inflater.inflate(mylayout_resourseID,parent,false);
            holder = new Datosholder();
            holder.textview = (TextView)row.findViewById(R.id.txt);
            row.setTag(holder);
        }else{
            holder = (Datosholder)row.getTag();
        }

        //Datos datos = mydata[position];
        String tarea = mydata.get(position).toString();
        //holder.textview.setText(datos.tarea);
        holder.textview.setText(tarea);

        return row;
    }

    static class Datosholder{
        TextView textview;
    }

}
    
answered by 23.07.2018 в 17:29