My code only takes the last element of the database

-5

My code only takes the last element of the database, however it lists the correct amount of it and log.i shows that it is catching all. Why does not this work?

package br.app.lista;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class CatalogoTodos extends Activity {

    private Livro livro;
    private Catalogo_Livro_Lista catalogoListaTodos;
    private ListView listTodosCatalogoId;
    private SQLiteDatabase db;
    private  SimpleCursorAdapter ad;
    //private String[] aaa = {"teste","teste1","teste","teste1","teste","teste1","teste","teste1","teste","teste1","teste","teste1"};




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

        listTodosCatalogoId =  (ListView) findViewById(R.id.listTodosCatalogoId);
        db = DBHelper.getDatabase(this,"livro");
        livro = new Livro();

        String listar = "SELECT * FROM livro";
        Cursor cursor = db.rawQuery(listar,null);
        ArrayList<Livro> lv = new ArrayList<Livro>();

        if(cursor.getCount() >0){

            while (cursor.moveToNext()){
                livro.setIsbn(cursor.getString(0));
                livro.setTitulo(cursor.getString(1));
                livro.setSubTitulo(cursor.getString(2));
                livro.setEdicao(cursor.getInt(3));
                livro.setAutor(cursor.getString(4));
                livro.setPaginas(cursor.getInt(5));
                livro.setAnoPublicacao(cursor.getInt(6));
                livro.setEditora(cursor.getString(7));
                livro.setCategoria(cursor.getString(8));
                lv.add(livro);

                Log.i("RESULTADO -" , "TITULO: " + cursor.getString(0));
                Log.i("RESULTADO -" , "AUTOR: " + cursor.getString(4));

            }
            catalogoListaTodos = new Catalogo_Livro_Lista(CatalogoTodos.this,lv);
           // ArrayAdapter<Livro> livroadapter = new ArrayAdapter<Livro>(CatalogoTodos.this,android.R.layout.simple_list_item_1,lv);
            listTodosCatalogoId.setAdapter(catalogoListaTodos);


        }else{
            Toast.makeText(CatalogoTodos.this, "Nenhum registro encontrado", Toast.LENGTH_SHORT).show();

        }

    }

    public void voltarCatalogoTodos (View botao){
        startActivity(new Intent(this, Catalogo.class));
        finish();
    }


}
package br.app.lista;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;


public class Catalogo_Livro_Lista extends BaseAdapter {
    private List<Livro> livros;
    private Activity activity;

    public Catalogo_Livro_Lista(Activity activity, List<Livro> livros) {
        this.livros = livros;
        this.activity = activity;
    }

    @Override
    public int getCount() {
        return livros.size();
    }

    @Override
    public Object getItem(int position) {
        return  livros.get(position);

    }

    @Override
    public long getItemId(int position) {
            return position;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        Livro livro =  livros.get(position);
        LayoutInflater inflater = activity.getLayoutInflater();
        View linha = inflater.inflate(R.layout.catalogo_livros_list,null);
        TextView nomeLivro = (TextView) linha.findViewById(R.id.txtNomeLivroId);
        TextView autor = (TextView) linha.findViewById(R.id.txtAutorLivroId);
        ImageView fotoLivro = (ImageView) linha.findViewById(R.id.imgLivrosId);

        nomeLivro.setText(livro.getTitulo());
        autor.setText(String.valueOf(livro.getAnoPublicacao()));

        if(livro.getImagemLivro()!= null){

            Bitmap imglivro = BitmapFactory.decodeFile(livro.getImagemLivro());
            fotoLivro.setImageBitmap(imglivro);


        }else{

            Drawable draw = activity.getResources().getDrawable(R.drawable.lupa);
            fotoLivro.setImageDrawable(draw);

        }


        return linha;

    }
}
    
asked by anonymous 09.11.2017 / 18:11

1 answer

4

How many times do you instantiate your class Livro ?

Answer: One. So you have only one book!

The place where you instantiate is here:

        livro = new Livro();

This is the single place where you give new Livro() . As this is not in the loop, then only one book was created.

Within while you do this:

            while (cursor.moveToNext()){
                livro.setIsbn(cursor.getString(0));
                livro.setTitulo(cursor.getString(1));
                livro.setSubTitulo(cursor.getString(2));
                livro.setEdicao(cursor.getInt(3));
                livro.setAutor(cursor.getString(4));
                livro.setPaginas(cursor.getInt(5));
                livro.setAnoPublicacao(cursor.getInt(6));
                livro.setEditora(cursor.getString(7));
                livro.setCategoria(cursor.getString(8));
                lv.add(livro);

                Log.i("RESULTADO -" , "TITULO: " + cursor.getString(0));
                Log.i("RESULTADO -" , "AUTOR: " + cursor.getString(4));

            }

That is, you are changing the defined book instead of creating a new book. What you should do is something like this:

            while (cursor.moveToNext()) {
                Livro livro = new Livro(); // <--- Observe essa linha.
                livro.setIsbn(cursor.getString(0));
                livro.setTitulo(cursor.getString(1));
                livro.setSubTitulo(cursor.getString(2));
                livro.setEdicao(cursor.getInt(3));
                livro.setAutor(cursor.getString(4));
                livro.setPaginas(cursor.getInt(5));
                livro.setAnoPublicacao(cursor.getInt(6));
                livro.setEditora(cursor.getString(7));
                livro.setCategoria(cursor.getString(8));
                lv.add(livro);

                Log.i("RESULTADO -" , "TITULO: " + cursor.getString(0));
                Log.i("RESULTADO -" , "AUTOR: " + cursor.getString(4));
            }

Remove these two lines that are outside for :

    private Livro livro;
        livro = new Livro();

This should solve your problem.

I also suggest that you change this:

        ArrayList<Livro> lv = new ArrayList<Livro>();

So:

        List<Livro> lv = new ArrayList<>();

There are other issues and possible improvements to your code, but to make sure you do not get too repetitive, see this other answer from me on another question similar to yours , especially the part that talks about avoiding empty constructors and about mixing visualization logic ( Toast.makeText(...) ) with query logic to the database.

    
09.11.2017 / 18:29