Autore Topic: problema con listview  (Letto 310 volte)

Offline coverbags

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    win 8.1
problema con listview
« il: 17 Febbraio 2015, 23:09:49 CET »
0
ciao  tutti , ho un piccolo problema.

sto cercando di inserire dati in un'edittext aggiornando una list view

il problema e' che anziche' aggiungere le view  nella listview , mi sovrascrive la nuova riga su quella gia' esistente

vi posto il codice, credo di fare qualche errore nell'array

mi date una mano ?

grazie mille
Codice (XML): [Seleziona]
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         // utilizzo il database nel metodo onCreate
        HelperBase helper= new HelperBase(this);
        final  SQLiteDatabase db= helper.getWritableDatabase();// rendo il database scrivibile
         final SQLiteDatabase dbRead=helper.getReadableDatabase();
         InserisciTesto = (EditText) this.findViewById(R.id.aggiungiTesto); // editText
         InserisciTesto.setImeOptions(EditorInfo.IME_ACTION_DONE);// aggiunge tasto "done " per far scomparire la tastiera
         InserisciTesto.setText("");
         AggiungiMemo = ( Button) this.findViewById(R.id.aggiungiMemo);// bottone di aggiunta testo
         Reset =(Button) this.findViewById(R.id.Reset);// bottone per resettare tutto
         
         AggiungiMemo.setOnClickListener(new OnClickListener(){
                 
                 public void onClick(View v ){
                         
                         ContentValues input = new ContentValues();
                         input.put("blabla",InserisciTesto.getText().toString());
                         db.insert("testo", null,input);
                         //String contenuto = input.toString();
                         //Toast.makeText(getApplicationContext(), contenuto, Toast.LENGTH_SHORT).show();
                         Toast.makeText(getApplicationContext(), "Dati salvati correttamente", Toast.LENGTH_SHORT).show();
                        recupera();
                 }
                 public void recupera(){
                         final String sql="SELECT * FROM testo ";
                         Cursor c = dbRead.rawQuery(sql, null);
                         while  (c.moveToNext()){
                                 InserisciTesto.setText(c.getString(1));
                                 //prendo tutte le stringhe da database , il numero uno (1) indica il campo blabla
                                 // se avessi messo il numero zero , mi avrebbe restituito il numero progressivo del campo ID
                                 
                                 inserisciInList();
                         }
                         
                         }
                 
                 
                 
                 
                 
         });
         
         
         
                        }
    public  void inserisciInList() {
         
    String [] testoperListView = {InserisciTesto.getText().toString()};
         int[] list= {R.id.listText};
         ArrayList<String>testoperView = new ArrayList<String>(100);
       
         for(int i=0;i<testoperListView.length;i++){
                 testoperView.add(testoperListView[i]);
         }
          ListView mylist = (ListView) findViewById(R.id.listText);
          ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, testoperListView);  
        mylist.setAdapter(adapter);
       
       
       
    }
         
         
         
         
         
   

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:problema con listview
« Risposta #1 il: 18 Febbraio 2015, 11:51:58 CET »
0
ciao,
ho dato un'occhiata al tuo codice e c'è un passaggio che non mi convince troppo... richiami inserisciInList() che, da quello che scrivi, non fa altro che prendere il contenuto della editText, metterlo in un array, creare un arrayList con quell'elemento e quindi creare un adapter che andrà a popolare i dati della listView. Questo per ogni elemento... di conseguenza ogni volta viene sovrascritto il precedente perché il tuo array viene ricostruito con l'unico dato nuovo. E non va bene.


Codice (Java): [Seleziona]
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         // utilizzo il database nel metodo onCreate
        HelperBase helper= new HelperBase(this);
        final  SQLiteDatabase db= helper.getWritableDatabase();// rendo il database scrivibile
         final SQLiteDatabase dbRead=helper.getReadableDatabase();
         InserisciTesto = (EditText) this.findViewById(R.id.aggiungiTesto); // editText
         InserisciTesto.setImeOptions(EditorInfo.IME_ACTION_DONE);// aggiunge tasto "done " per far scomparire la tastiera
         InserisciTesto.setText("");
         AggiungiMemo = ( Button) this.findViewById(R.id.aggiungiMemo);// bottone di aggiunta testo
         Reset =(Button) this.findViewById(R.id.Reset);// bottone per resettare tutto
         //Dichiaro qui l'arrayList, creo l'adapter e lo aggiungo alla listview.
         ArrayList<String>testoperView = new ArrayList<String>();
         ListView mylist = (ListView) findViewById(R.id.listText);
         ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, testoperView);  
         mylist.setAdapter(adapter);           


         AggiungiMemo.setOnClickListener(new OnClickListener(){
                 
                 public void onClick(View v ){
                         
                         ContentValues input = new ContentValues();
                         input.put("blabla",InserisciTesto.getText().toString());
                         db.insert("testo", null,input);
                         //String contenuto = input.toString();
                         //Toast.makeText(getApplicationContext(), contenuto, Toast.LENGTH_SHORT).show();
                         Toast.makeText(getApplicationContext(), "Dati salvati correttamente", Toast.LENGTH_SHORT).show();
                        recupera();
                 }
                 public void recupera(){
                         final String sql="SELECT * FROM testo ";
                         Cursor c = dbRead.rawQuery(sql, null);
                         while  (c.moveToNext()){
                                 InserisciTesto.setText(c.getString(1));
                                 //prendo tutte le stringhe da database , il numero uno (1) indica il campo blabla
                                 // se avessi messo il numero zero , mi avrebbe restituito il numero progressivo del campo ID
                                 
                                 inserisciInList();
                         }
                         
                         }

         });

                        }
    public  void inserisciInList() {
          //qui aggiungi il testo all'arraylist..
          testoperView.add(InserisciTesto.getText().toString());
          //a questo punto notifica il cambiamento dei dati alla listview in questo modo:
          adapter.notifyDataSetChanged();
    }
   

Per fretta non l'ho provato ma dovrebbe funzionare :) Facci sapere.

PS: qui ti ho caricato un esempio di aggiornamento del listview al click del pulsante: Programmando: Android: Aggiornare ListView al click di un bottone
« Ultima modifica: 18 Febbraio 2015, 13:04:11 CET da alfy91 »

Offline coverbags

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    win 8.1
Re:problema con listview
« Risposta #2 il: 18 Febbraio 2015, 21:59:38 CET »
0
ciao grazie per la risposta.
in effetti ho intuito che l'errore potesse essere nel metodo
ho copiato il tuo codice ma mi da' errore proprio nel metodo inserisciInList()

il log mi da' questo tipo di errore

 02-18 20:57:03.985: E/libsuspend(1246): Error writing to /sys/power/state: No such device
altri suggerimenti ?

grazie mille




Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:problema con listview
« Risposta #3 il: 19 Febbraio 2015, 12:44:12 CET »
0
Ciao, l'errore mi sembra piuttosto strano e non credo sia generato dal codice che abbiamo inserito... che versione di Android hai?
E soprattutto, puoi postare tutto il logcat?
Grazie.

Offline coverbags

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    win 8.1
Re:problema con listview
« Risposta #4 il: 24 Febbraio 2015, 23:09:53 CET »
0
ciao  tutti , grazie per il supporto

ho risolto il problema ordinando un po' il codice che allego per i posteri.

non faccio altro che popolare una listview con dei dati che prendo da un database.

Codice (XML): [Seleziona]
package com.example.memopad;

import java.util.ArrayList;

import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
        private EditText InserisciTesto;
        private Button AggiungiMemo;
        private Button Reset;
        private ListView mylist;
        private HelperBase helper;
        private SQLiteDatabase db;
        private SQLiteDatabase dbRead;
        private ArrayList<String> lista;
        private ArrayList<Long> listaId;

        private Cursor c;

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

        }

       
        private void recuperaView() {
                AggiungiMemo = (Button) this.findViewById(R.id.aggiungiMemo);// bottone
                // di
                // aggiunta
                // testo
                Reset = (Button) this.findViewById(R.id.Reset);// bottone per resettare
                // tutto
                mylist = (ListView) findViewById(R.id.listText);
                InserisciTesto = (EditText) this.findViewById(R.id.aggiungiTesto);
                // editText
                InserisciTesto.setImeOptions(EditorInfo.IME_ACTION_DONE);// aggiunge
                                                                                                                                        // tasto
                                                                                                                                        // "done "
                                                                                                                                        // per far
                                                                                                                                        // scomparire
                                                                                                                                        // la
                                                                                                                                        // tastiera
                InserisciTesto.setText("");
        }

        private void setAllListener() {
                mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
                       @Override  
                       public void onItemClick(AdapterView<?> adattatore, final View componente, int pos, long id){
                         
                          eliminaVoce(listaId.get(pos));
                     }  
                });  
                AggiungiMemo.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {

                                inserisciNelDb();
                                InserisciTesto.setText("");
                        }
                });
        }
       
        private void eliminaVoce(Long id){
                String[] w={id.toString()};
               
                db.delete("testo", "_id = ?", w);
               
                aggiornaLista();
               
               
        }

        private void inizializzaDd() {
                helper = new HelperBase(this);
                db = helper.getWritableDatabase();// rendo scrivibile il db
                dbRead = helper.getReadableDatabase();// db diventa leggibile
        }

        private void inserisciNelDb() {
                ContentValues input = new ContentValues();
                input.put("blabla", InserisciTesto.getText().toString());
                db.insert("testo", null, input);
                Toast.makeText(getApplicationContext(), "Dati salvati correttamente",
                                Toast.LENGTH_SHORT).show();
                aggiornaLista();
        }

        public void aggiornaLista() {
                final String sql = "SELECT * FROM testo ";
                Cursor c = dbRead.rawQuery(sql, null);
                lista=new ArrayList<String>();
                listaId=new ArrayList<Long>();
               
               
                while (c.moveToNext()) {
                       
                        lista.add(c.getString(1));
                        listaId.add(c.getLong(0));
                        System.out.println(c.getLong(0));
                        // prendo tutte le stringhe da database , il numero uno (1)
                        // indica il campo blabla
                        // se avessi messo il numero zero , mi avrebbe restituito il
                        // numero progressivo del campo ID

                        inserisciInList();
                }

        }
        public void inserisciInList() {

               

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, lista);
                mylist.setAdapter(adapter);
                adapter.notifyDataSetChanged();

        }
 

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // Handle action bar item clicks here. The action bar will
                // automatically handle clicks on the Home/Up button, so long
                // as you specify a parent activity in AndroidManifest.xml.
                int id = item.getItemId();
                if (id == R.id.action_settings) {
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }
}

ora sono alle prese con un bug.

in effetti eliminando gli elementi della listview con un tocco  , l'ultimo della lista , sebbene cancellato dal database, resta visibile, quindi cliccandoci un'altra volta, mi manda in crash l'applicazione

spero di essere stato chiaro .

riuscite a darmi una mano ?