Как группировать элементы из базы данных и отображать их – Android

У меня есть модель квитанций и журналов в приложении для Android. Квитанция имеет много журналов.

Я сделал запрос для журналов group_by по sortID и классу.

//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(); 

Эта группировка отлично работает. Проблема следующая. Мне нужно иметь такой вывод (часть в красном круге): Введите описание изображения здесь Но я понимаю:

Введите описание изображения здесь

И это часть кода, как я это сделал.

 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; } } } 

Я использую ActiveAndroid и отображаю его в списке.

ПРОБЛЕМА – это отображение этих сгруппированных элементов. Я показываю их в списке BaseAdapter listView, и он показывает мне только один элемент для каждой группы, но мне нужно показать несколько элементов (потому что в каждой группе их больше 4).

Может ли кто-нибудь дать мне совет, что я должен сделать, чтобы получить результат, например, на первом изображении?

Solutions Collecting From Web of "Как группировать элементы из базы данных и отображать их – Android"

Похоже, вы пытаетесь получить результаты, похожие на следующий SQL:

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

Вы показываете отображаемый счет, вычисляемый как logList.size() . Вместо этого, если у вас будет группа базы данных, вам также нужно будет получить счетчик из базы данных.

Это может помочь и пара вещей. 1. Проверьте запрос SQL непосредственно к базе данных, чтобы убедиться, что вы начинаете с предполагаемого набора результатов. Вы можете использовать клиент sqlite3 для тестирования, предполагая, что вы используете SQLite db. 2. Включить ведение ActiveAndroid.initialize в ActiveAndroid.initialize

Также вы можете дважды проверить правописание параметров, чтобы убедиться, что вы ссылаетесь на предполагаемый параметр цели.

После того, как вы подтвердите правильность результатов запроса, вы можете сосредоточиться на том, будете ли вы отображать его в списке по своему усмотрению.

Наконец, будьте осторожны в работе над потоком пользовательского интерфейса.

Пользователь user650881 'прав (я не могу голосовать с репо <50).

Кроме того, чтобы получить сводку общей таблицы, вы можете выполнить следующий SQL-запрос:

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

Если вы хотите иметь элементы, сгруппированные по разным полям, вы также можете попробовать вдова функции, то есть:

 select count(grade) over(partition by fieldName) 

И группа в конечном итоге не нужна