Comment grouper les éléments de la firebase database et les afficher – Android

J’ai un modèle de reçu et des journaux dans l’application Android. Reçu a de nombreux journaux.

J’ai fait une requête pour les journaux group_by par leur sorting et leur grade.

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

Ce regroupement fonctionne bien. Le problème est le suivant. J’ai besoin d’avoir une sortie comme celle-ci (partie dans le cercle rouge): entrer la description de l'image ici mais je comprends comme ça:

entrer la description de l'image ici

Et cela fait partie du code comment j’ai fait cela.

 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(Ssortingng.valueOf("recepitID")); List 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  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  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 logsList; public RecapitulationArrayAdapter(List 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(Ssortingng.valueOf(logsList.size())); ((TextView) convertView.findViewById(R.id.rec_logs_mass)).setText(Ssortingng.format("%.2f m3", log.getM3())); if (log.receipt.priceType.equals("Na panju")) { ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(Ssortingng.valueOf(log.price.stumpPrice_kn)); } else { ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(Ssortingng.valueOf(log.price.roadPrice_kn)); } if (log.receipt.priceType.equals("Na panju")) { ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(Ssortingng.format("%.2f KN", log.price.stumpPrice_kn * log.getM3())); } else { ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(Ssortingng.format("%.2f KN", log.price.roadPrice_kn * log.getM3())); } return convertView; } } } 

J’utilise ActiveAndroid et l’affiche dans listview.

PROBLEME consiste à afficher ces éléments groupés. Je les affiche dans BaseAdapter listView et il ne montre qu’un seul élément par groupe, mais il doit afficher plusieurs éléments (car chaque groupe contient plus de 4 éléments).

Quelqu’un peut-il me donner des conseils que dois-je faire pour obtenir une sortie comme sur la première image?

Il semble que vous essayiez d’obtenir des résultats similaires à ceux du code SQL suivant:

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

Vous affichez le nombre affiché calculé en tant que logList.size() . Au lieu de cela, si vous souhaitez que la firebase database regroupe les enregistrements, vous souhaiterez également obtenir le compte de la firebase database.

Quelques choses peuvent aussi aider. 1. Vérifiez la requête SQL directement sur la firebase database pour vérifier que vous commencez avec le jeu de résultats prévu. Vous pouvez utiliser le client sqlite3 pour tester en supposant que vous utilisez une firebase database SQLite. 2. Activer la connexion ActiveAndroid.initialize dans ActiveAndroid.initialize

Vous pouvez également vérifier l’orthographe du paramètre pour vous assurer que vous faites référence au paramètre d’intention prévu.

Une fois que vous avez vérifié que les résultats de la requête sont corrects, vous pouvez déterminer si vous souhaitez les afficher dans la liste comme vous le souhaitez.

Enfin, méfiez-vous de faire du travail sur le thread de l’interface utilisateur.

L’utilisateur ‘user650881’ a raison (je ne peux pas voter depuis repo <50).

En outre, pour obtenir le résumé de la table totale, vous pouvez exécuter la requête SQL suivante:

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

Si vous souhaitez regrouper les éléments par différents champs, vous pouvez également essayer les fonctions veuves, à savoir:

 select count(grade) over(partition by fieldName) 

et group by n’est finalement pas nécessaire