Подтвердить что ты не робот

Как группировать элементы из базы данных и отображать их - 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 и отображаю его в списке.

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

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

4b9b3361

Ответ 1

Похоже, вы пытаетесь получить результаты, похожие на следующий 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 в ActiveAndroid.initialize

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

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

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

Ответ 2

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

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

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

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

select count(grade) over(partition by fieldName)

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