2016-05-30 6 views
40

Ho il modello di ricevuta e log nell'app per Android. La ricevuta ha molti log.Come raggruppare gli elementi dal database e visualizzarli - Android

Ho effettuato la query per i registri group_by in base a ID ordinamento e grado.

//recieve RecepitID and query to group logs 
final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); 
List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID, Grade").execute(); 

Questo raggruppamento funziona correttamente. Il problema è il prossimo Ho bisogno di avere output come questo (parte nel cerchio rosso): enter image description here ma ottengo in questo modo:

enter image description here

e questo fa parte del codice di come ho fatto questo.

public class LogsRecapitulation extends AppCompatActivity { 

    private ListView mainListView; 
    private BaseAdapter listAdapter; 
    private TextView logsCount; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.recapitulation_listview); 
     mainListView = (ListView) findViewById(R.id.ListViewItem); 

     //recieve RecepitID and query to group logs 
     final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); 
     List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID, Grade").execute(); 

     TextView result = (TextView) findViewById(R.id.LogMassResult); 
     double sum = 0.0; 
     for (int i = 0; i < logsList.size(); i++) { 
      sum += logsList.get(i).getM3(); 
     } 
     result.setText(String.format("%.2f m3", sum)); 

     for (int i = 0; i < logsList.size(); i++) { 
      if (logsList.get(i).receipt.priceType.equals("Na panju")) { 
       TextView stumpPriceKN = (TextView) findViewById(R.id.sumPriceKN); 
       double sumPricekn = 0.0; 

       for (int j = 0; j < logsList.size(); j++) { 
        sumPricekn += logsList.get(j).price.stumpPrice_kn * logsList.get(j).getM3(); 
       } 
       stumpPriceKN.setText(String.format("%.2f KN", sumPricekn)); 

      } else { 
       TextView roadKN = (TextView) findViewById(R.id.sumPriceKN); 
       double roadPrKn = 0.0; 
       for (int j = 0; j < logsList.size(); j++) { 
        roadPrKn += logsList.get(j).price.roadPrice_kn * logsList.get(j).getM3(); 
       } 
       roadKN.setText(String.format("%.2f KN", roadPrKn)); 
      } 
     } 

     for (int i = 0; i < logsList.size(); i++) { 
      if (logsList.get(i).receipt.priceCorrection > 0 && logsList.get(i).receipt.priceType.equals("Na panju")) { 
       TextView corecctionPriceKn = (TextView) findViewById(R.id.correctionPriceKN); 
       double correcSumKN = 0.0; 
       for (int j = 0; j < logsList.size(); j++) { 
        correcSumKN += (logsList.get(j).price.stumpPrice_kn * logsList.get(j).getM3()) + ((logsList.get(j).price.stumpPrice_kn * logsList.get(j).getM3()) * logsList.get(j).receipt.priceCorrection/100); 
       } 
       corecctionPriceKn.setText(String.format("%.2f KN", correcSumKN)); 
      } else if (logsList.get(i).receipt.priceCorrection > 0 && logsList.get(i).receipt.priceType.equals("Šumska cesta")) { 
       TextView corecctionPriceKn = (TextView) findViewById(R.id.correctionPriceKN); 
       double correcSumKN = 0.0; 
       for (int j = 0; j < logsList.size(); j++) { 
        correcSumKN += (logsList.get(j).price.roadPrice_kn * logsList.get(j).getM3()) + ((logsList.get(j).price.roadPrice_kn * logsList.get(j).getM3()) * logsList.get(j).receipt.priceCorrection/100); 
       } 
       corecctionPriceKn.setText(String.format("%.2f KN", correcSumKN)); 
      } else { 
       TextView priceHolder = (TextView) findViewById(R.id.KorekcijaCijene); 
       TextView corecctionPriceKn = (TextView) findViewById(R.id.correctionPriceKN); 
       priceHolder.setText(""); 
       corecctionPriceKn.setText(""); 
      } 
     } 

     listAdapter = new RecapitulationArrayAdapter(logsList); 
     mainListView.setAdapter(listAdapter); 

     //display logs count 
     logsCount = (TextView) findViewById(R.id.logsCount); 
     logsCount.setText(String.valueOf(logsList.size())); 
    } 

    private class RecapitulationArrayAdapter extends BaseAdapter { 
     private LayoutInflater inflater; 
     private List<Logs> logsList; 

     public RecapitulationArrayAdapter(List<Logs> logsList) { 
      inflater = LayoutInflater.from(LogsRecapitulation.this); 
      this.logsList = logsList; 
     } 

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

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

     @Override 
     public long getItemId(int position) { 
      return logsList.get(position).getId(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.logs_recapitulation, parent, false); 
      } 
      Logs log = logsList.get(position); 
      ((TextView) convertView.findViewById(R.id.rec_log_sort)).setText(log.sort_id); 
      ((TextView) convertView.findViewById(R.id.rec_log_class)).setText(log.grade); 
      ((TextView) convertView.findViewById(R.id.rec_log_count)).setText(String.valueOf(logsList.size())); 
      ((TextView) convertView.findViewById(R.id.rec_logs_mass)).setText(String.format("%.2f m3", log.getM3())); 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.stumpPrice_kn)); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.roadPrice_kn)); 
      } 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.stumpPrice_kn * log.getM3())); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.roadPrice_kn * log.getM3())); 
      } 

      return convertView; 
     } 
    } 

} 

Sto usando ActiveAndroid e visualizzandolo in listview.

PROBLEMA è con la visualizzazione di questi elementi raggruppati. Li sto visualizzando in listView BaseAdapter e mi mostra solo un articolo per gruppo, ma deve mostrarmi più elementi (perché ha più di 4 elementi in ogni gruppo).

Qualcuno può darmi un consiglio che cosa dovrei fare per ottenere risultati simili alla prima immagine?

+0

Quali righe di codice popola elementi in un gruppo? – Pehlaj

+0

@ P.Rai in questa riga è la mia query sql 'Elenco logsList = new Select(). From (Logs.class) .where (" Receipt = "+ forwardedId) .groupBy (" SortID, Grade "). Execute (); 'e nel metodo' viewView getView' pubblico sto popolando gli elementi nel gruppo. – RubyDigger19

risposta

1

Sembra che si sta tentando di ottenere risultati simili al seguente SQL:

select sort, grade, count(grade), sum(mass), price from logs where receiptid = forwardedId group by sort, grade; 

vi mostrerà il conteggio visualizzato calcolato come logList.size(). Invece, se si desidera che il database raggruppi i record, si vorrà ottenere anche il conteggio dal database.

Un paio di cose possono anche aiutare. 1. Verificare la query SQL direttamente sul database per verificare che si stia iniziando con il set di risultati desiderato. È possibile utilizzare il client sqlite3 per testare supponendo che si stia utilizzando un db SQLite. 2. Abilitare l'accesso ActiveAndroid in ActiveAndroid.initialize

Inoltre, è possibile ricontrollare il parametro di spelling per assicurarsi di fare riferimento al parametro di intento desiderato.

Una volta verificato che i risultati della query sono corretti, è possibile concentrarsi sul fatto che lo si sta visualizzando nell'elenco come si desidera.

Infine fai attenzione a lavorare sul thread dell'interfaccia utente.

1

L'utente 'user650881' ha ragione (non posso votare dal repository < 50).

Inoltre per raggiungere la sintesi per la tabella totale è possibile eseguire la seguente query SQL:

select /*sort, grade,*/ count(grade), sum(mass), price from logs where receiptid = forwardedId /*group by sort, grade*/; 

se si desidera avere gli elementi raggruppati da diversi campi che si può anche provare le funzioni vedova vale a dire:

select count(grade) over(partition by fieldName) 

e di gruppo da non è eventualmente necessaria

Problemi correlati