Autore Topic: Problema Listview con valori presi da un database  (Letto 662 volte)

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Problema Listview con valori presi da un database
« il: 10 Luglio 2012, 20:23:09 CEST »
0
Salve a tutti....sto cercando di esercitarmi creando una calcolatrice, qui sotto posto prima il codice poi spiego il problema....


Codice (Java): [Seleziona]
Questo è il codice della classe che gestisce il mio database



public class DataHelper extends SQLiteOpenHelper {
       
       
        private static final String DATABASE_NAME = "data_calculator_droid.db";
        private static final int SCHEMA_VERSION=1;
       
       
        public DataHelper(Context context){
                super(context, DATABASE_NAME, null, SCHEMA_VERSION);
       
        }



        public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE history (_id INTEGER PRIMARY KEY AUTOINCREMENT, total TEXT, operazione TEXT, icon TEXT, date TEXT, time TEXT);");     
        }



        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                //Null
        }
       
       
        public Cursor getAll() {
                return(getReadableDatabase().rawQuery("SELECT _id, total, operazione, icon, date, time FROM history LIMIT 50", null));
                }
       
       
        public void insert(String total, String operazione, String icon, String date, String time){
                ContentValues cv=new ContentValues();
                cv.put("total", total);
                cv.put("operazione", operazione);
                cv.put("icon", icon);
                cv.put("date", date);
                cv.put("time", time);
                getWritableDatabase().insert("history", "total", cv);
        }
       
       
       
       
        public void delete(String id) {
                getWritableDatabase().delete("history", "_id=?", new String[] {id});
               
        }
       
       
       
        public void clear(){
                SQLiteDatabase db = this.getWritableDatabase();
                   db.delete("history",null,null);
    }
       
       
       
    public String getTotal(Cursor c){
                return (c.getString(1));
               
        }
   
    public String getOperazione(Cursor c){
                return (c.getString(2));
               
        }
       
       
        public String getIcon(Cursor c){
                return (c.getString(3));
               
        }
       
       
        public String getDate(Cursor c){
                return (c.getString(4));
               
        }
       
        public String getTime(Cursor c){
                return (c.getString(5));
               
        }
       
       
        public Cursor getById(String id) {
                String [] args={id};
                return(getReadableDatabase().rawQuery("SELECT _id, total, operazione, icon, date, time FROM history WHERE _id=?", args));
        }






       


}



Qui nella classe principale gestisco l'inserimento dei dai in una row custom tutti va in una listview

       
       

       
        //Row History
    class DataAdapter extends CursorAdapter {
       
        @SuppressWarnings("deprecation")
                DataAdapter(Cursor c) {
        super(StartActivity.this, c);
        }
               
       
       
       
               
        @Override
        public void bindView (View row, Context ctxt, Cursor c){
       
        DataHolder holder = (DataHolder)row.getTag();
        holder.populateFrom(c, helper);
       
       
        }
       
        @Override
        public View newView (Context ctxt, Cursor c, ViewGroup parent){
               
               
                LayoutInflater inflater=getLayoutInflater();
                View row=inflater.inflate(R.layout.row_history, parent, false);
                DataHolder holder=new DataHolder(row);
                row.setTag(holder);
               
                return(row);
        }
       
         
       
        }
 
   
    static class DataHolder {
               
               
        DataHolder(View row) {
               
                ID = (TextView)row.findViewById(R.id.id_row);
                ID.setTypeface(font);
               
                TOTAL = (TextView)row.findViewById(R.id.total_row);
                TOTAL.setTypeface(font);
               
                OPERAZIONE = (TextView)row.findViewById(R.id.operation_row);
                OPERAZIONE.setTypeface(font);
               
                DATE = (TextView)row.findViewById(R.id.date_row);
                DATE.setTypeface(font);
               
                TIME = (TextView)row.findViewById(R.id.time_row);
                TIME.setTypeface(font);
               
                ICON = (ImageView)row.findViewById(R.id.image_row);
               
                }
               
       
        void populateFrom(Cursor c, DataHelper helper) {
               
                temp = model.getPosition()+1;
                ID.setText(""+temp);
                TOTAL.setText(helper.getTotal(c));
                OPERAZIONE.setText(helper.getOperazione(c));
                DATE.setText(helper.getDate(c));
                TIME.setText(helper.getTime(c));
               
               
               
                if (helper.getIcon(c).equals("add")){
                        ICON.setImageResource(R.drawable.add); 
                }else if (helper.getIcon(c).equals("sub")){
                        ICON.setImageResource(R.drawable.sub);         
                }else if (helper.getIcon(c).equals("mol")){
                        ICON.setImageResource(R.drawable.mol);         
                }else if (helper.getIcon(c).equals("div")){
                        ICON.setImageResource(R.drawable.div);         
                }else if (helper.getIcon(c).equals("rad")){
                        ICON.setImageResource(R.drawable.rad);         
                }else if (helper.getIcon(c).equals("perc")){
                        ICON.setImageResource(R.drawable.per);         
                }else if (helper.getIcon(c).equals("percent")){
                        ICON.setImageResource(R.drawable.percent);             
                }else if (helper.getIcon(c).equals("log")){
                        ICON.setImageResource(R.drawable.log);         
                }else if (helper.getIcon(c).equals("in")){
                        ICON.setImageResource(R.drawable.in);          
                }else if (helper.getIcon(c).equals("quadro")){
                        ICON.setImageResource(R.drawable.quadrato);            
                }else if (helper.getIcon(c).equals("cubo")){
                        ICON.setImageResource(R.drawable.cubo);        
                }else if (helper.getIcon(c).equals("xy")){
                        ICON.setImageResource(R.drawable.xy);          
                }else if (helper.getIcon(c).equals("dieci_elev")){
                        ICON.setImageResource(R.drawable.dieci_elev);          
                }else if (helper.getIcon(c).equals("n")){
                        ICON.setImageResource(R.drawable.n);           
                }else if (helper.getIcon(c).equals("1x")){
                        ICON.setImageResource(R.drawable.x1);          
                }else if (helper.getIcon(c).equals("ex")){
                        ICON.setImageResource(R.drawable.ex);          
                }else if (helper.getIcon(c).equals("rad3")){
                        ICON.setImageResource(R.drawable.rad3);        
                }else if (helper.getIcon(c).equals("xrady")){
                        ICON.setImageResource(R.drawable.xrady);               
                }else if (helper.getIcon(c).equals("exp")){
                        ICON.setImageResource(R.drawable.exp); 
                }else if (helper.getIcon(c).equals("e")){
                        ICON.setImageResource(R.drawable.e);   
                }else if (helper.getIcon(c).equals("pi")){
                        ICON.setImageResource(R.drawable.pi);  
                       
                       
                }else if (helper.getIcon(c).equals("sin")){
                        ICON.setImageResource(R.drawable.sin);
                }else if (helper.getIcon(c).equals("cos")){
                        ICON.setImageResource(R.drawable.cos);
                }else if (helper.getIcon(c).equals("tan")){
                        ICON.setImageResource(R.drawable.tan);
                       
                }else if (helper.getIcon(c).equals("sin1")){
                        ICON.setImageResource(R.drawable.sin_1);
                }else if (helper.getIcon(c).equals("cos1")){
                        ICON.setImageResource(R.drawable.cos_1);
                }else if (helper.getIcon(c).equals("tan1")){
                        ICON.setImageResource(R.drawable.tan_1);
                       
                       
                }else if (helper.getIcon(c).equals("sinh")){
                        ICON.setImageResource(R.drawable.hyp);
                }else if (helper.getIcon(c).equals("sinh1")){
                        ICON.setImageResource(R.drawable.hyp_1);
                }else if (helper.getIcon(c).equals("cosh")){
                        ICON.setImageResource(R.drawable.hyp);
                }else if (helper.getIcon(c).equals("cosh1")){
                        ICON.setImageResource(R.drawable.hyp_1);
                }else if (helper.getIcon(c).equals("tanh")){
                        ICON.setImageResource(R.drawable.hyp);
                }else if (helper.getIcon(c).equals("tanh1")){
                        ICON.setImageResource(R.drawable.hyp_1);
                       
               
               
                }else if (helper.getIcon(c).equals("npr")){
                        ICON.setImageResource(R.drawable.npr);         
                }else if (helper.getIcon(c).equals("ncr")){
                        ICON.setImageResource(R.drawable.ncr);         
                }
               
                       
               
               
               
               
            }
        }



       
}



In on create ho inserito questo codice



        helper=new DataHelper(this);
       
        model=helper.getAll();
        startManagingCursor(model);
        adapter=new DataAdapter(model);




Cosi inserisco ogni valta i dati in helper


                                //Date
                                Calendar c = Calendar.getInstance();  
                                date = new SimpleDateFormat("dd-MM-yyyy");  
                                formatted_date = date.format(c.getTime());  
                               
                                //Time
                                time = new SimpleDateFormat("hh:mm:ss");  
                                formatted_time = time.format(c.getTime());
                               
      helper.insert(" = "+ risultato.getText().toString(), titolo_result.getText().toString(), metodo.getText().toString(), formatted_date,formatted_time);
                                model.requery();




poi in pratica quando premo uguale parte l'
inserimento nel database e nella listview
per vedere la listview questo è il codice



case R.id.button_memory:
                       
                       
                        if (adapter.isEmpty()){
                                //Custom Toast
                        LayoutInflater inflater0 = getLayoutInflater();
                    View layout = inflater0.inflate(R.layout.toast_result_history,(ViewGroup) findViewById(R.id.layout_toast_result));
                        Toast toast0 = new Toast(getApplicationContext());
                        toast0.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL, 0, 0);
                        toast0.setDuration(Toast.LENGTH_SHORT);
                        toast0.setView(layout);
                        toast0.show(); 
                        }else{
                                //Dialog Custom
                                dialog_list = new Dialog(StartActivity.this);
                                dialog_list.requestWindowFeature(Window.FEATURE_NO_TITLE);
                                dialog_list.setContentView(R.layout.layout_list);
                            dialog_list.setCancelable(false);
                           
                           
                           
                           
                            //Font
                        asset = getResources().getAssets();
                        font = Typeface.createFromAsset(asset, "font/roboto.ttf");
                           
                            final TextView tx_list = (TextView) dialog_list.findViewById(R.id.text_list);
                           
                            count = model.getCount()+1-1;
                            tx_list.setText("STORICO RISULTATI: "+count + " VALORI");
                            tx_list.setTypeface(font);
                           
                           
                            dialog_listview_history = (ListView) dialog_list.findViewById(R.id.list_listview);
                            dialog_listview_history.setAdapter(adapter);
                           
                           
                           
                            //Scroll List
                            dialog_listview_history.setOnScrollListener(new OnScrollListener(){

                                        public void onScroll(AbsListView view, int VisibleItem, int visibleItemCount, int totalItemCount) {
                                               
                                       
                                       
                                        }

                                       
                                        public void onScrollStateChanged(AbsListView view, int scrollState) {
                                               
                                               
                                                //Disable Scrolling Listview
                                                //dialog_listview_history.smoothScrollBy(dialog_listview_history.getScrollX(), 0);
                                                //dialog_listview_history.smoothScrollBy(dialog_listview_history.getScrollY(), 0);
                                               
                                               
                                        }
                               
                               
                            });
                           
                           
                           
                           
                            //Click ItemListView
                            dialog_listview_history.setOnItemClickListener(new OnItemClickListener() {
                                  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                               
                                  TextView total = (TextView)view.findViewById(R.id.total_row);
                                 
                                  risultato.setText(total.getText().toString().replace("=", ""));
                                  dialog_list.dismiss();
                                 
                                 
                                 }
                                });
                           



allora ovviamente non potevo postare tutto il codice era troppo lungo, sin qui in pratica funziona alla grande fa tutto bene anche l'inserimento nel database e nella listview...

ma il problema è che quando supera un certo numero di valori nella listview e si attiva lo scrolling ogni volta che vado a fare lo scroll verso il basso o verso l'
alto si ripetono le righe dalla prima in poi...ripeto solo quando faccio lo scrolling.

Io penso che il problema si trova nel metodo binView e newView cioè quando imposto e vado a popolare la listview.....

ringrazio in anticipo...ci sto sbattendo la testa da molti giorni non riesco a risolvere.... :'(
« Ultima modifica: 10 Luglio 2012, 20:42:11 CEST da xwilly84 »

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Re:Problema Listview con valori presi da un database
« Risposta #1 il: 12 Luglio 2012, 19:12:00 CEST »
0
ho risolto era un errore banale.....

Codice (Java): [Seleziona]
 
static class DataHolder {
       
        private TextView ID = null;
        private TextView TOTAL = null;
        private TextView OPERAZIONE = null;
        private TextView DATE = null;
        private TextView TIME = null;
        private ImageView ICON = null;

Andavano dichiarati all'interno della classe DataHolder in

Codice (Java): [Seleziona]
class DataAdapter extends CursorAdapter {
Adesso va alla grande!