2016-05-30 3 views
40

アンドロイドアプリで領収書とログモデルを持っています。レシートhasManyログ。データベースからアイテムをグループ化して表示する方法 - Android

sortIDとgradeによってgroup_byログのクエリを作成しました。

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

このグループ分けは問題ありません。問題は次にあります。私は、この(赤い円の中に一部)のような出力を持っている必要があります: enter image description here が、私はこのようにそれを得る:

enter image description here

をそして、これは私がこれを行ってどのようにコードの一部です。

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を使用しており、これをlistviewに表示しています。

問題はこれらのグループ化された項目を表示していることです。私はそれをBaseAdapter listViewに表示しています。グループごとに1つしか表示されませんが、複数の項目を表示する必要があります(各グループに4つ以上の項目があるため)。

誰も私に最初のイメージのような出力を得るために何をすべきですか?あなたは、次のSQLに似た結果を取得しようとしているよう

+0

最終的に必要ではないでしょうか? – Pehlaj

+0

この行の@ P.Raiは、私のSQLクエリです。リスト logsList = new Select()。(Logs.class).where( "Receipt =" + forwardedId).groupBy( "SortID、Grade")。execute( ); 'public View getView'メソッドでは、アイテムをグループに取り込みます。 – RubyDigger19

答えて

1

に見えます:

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

あなたはlogList.size()として計算表示数を示しています。代わりに、データベース・グループにレコードを持たせる場合は、データベースからもカウントを取得することをお勧めします。

2つのことも役立ちます。 1.データベースに対してSQLクエリを直接検証し、目的の結果セットで開始していることを確認します。 SQLiteデータベースを使用していると仮定してsqlite3クライアントを使用してテストすることができます。 2. ActiveAndroidログインを有効にするActiveAndroid.initialize

また、意図したインテントパラメータを参照していることを確認するために、パラメータのスペルを再度確認することもできます。

クエリの結果が正しいことを確認したら、希望どおりリストにレンダリングしているかどうかを確認できます。

最後に、UIスレッドの作業には注意が必要です。

1

ユーザー 'user650881'が正しい(私はrepo <から投票できません)。さらに、次の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) 

やグループによるコードの行は、グループ内の項目を移入どの

関連する問題