如何将多个表数据显示在一个布局中

时间:2016-03-08 16:17:38

标签: android sql

我有2张桌子,Logs和Price。表日志中的内容显示在每个项目的textview中。现在我想将表格中的一些内容显示在同一个基本适配器中。

有可能,我应该怎么做?

这是我使用基本适配器的活动,其中我显示了表格日志的内容。我该如何在这里显示内容表格价格?

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.display_logs_listview);
        boolean sort = getIntent().getBooleanExtra("sort", false);
        mainListView = (ListView) findViewById(R.id.ListViewItem);

        final String place = (String) getIntent().getExtras().get("keyPlace");
        dbHandler = new LogsDBHandler(this);
        ArrayList<Logs> logsList = sort ? dbHandler.getAllLogsByPlace() : dbHandler.getAllLogs(place);

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

        listAdapter = new LogsArrayAdapter(logsList);
        mainListView.setAdapter(listAdapter);
    }

    private class LogsArrayAdapter extends BaseAdapter {
        private LayoutInflater inflater;
        private List<Logs> logsList;
        private List<Price> priceList;

        public LogsArrayAdapter(List<Logs> logsList) {
            inflater = LayoutInflater.from(DisplayLogs.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(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.activity_display_logs, parent, false);
            }
            Logs log = logsList.get(position);
            ((TextView) convertView.findViewById(R.id.textPlace)).setText(log.getPlace());
            ((TextView) convertView.findViewById(R.id.textNumber)).setText(log.getPlate_number());
            ((TextView) convertView.findViewById(R.id.textSort)).setText(log.getSort_id());
            ((TextView) convertView.findViewById(R.id.textGrade)).setText(log.getGrade());
            ((TextView) convertView.findViewById(R.id.textDiameter)).setText(log.getDiameter());
            ((TextView) convertView.findViewById(R.id.textLength)).setText(log.getLength());
            Log.d("Value", log.getCreatedAt());
            try {
                Date dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(log.getCreatedAt());
                ((TextView) convertView.findViewById(R.id.textDate)).setText(new SimpleDateFormat("dd.MM.yyyy HH:mm").format(dt));
            } catch (ParseException e) {
                e.printStackTrace();
            }

            Log.d("Masa Trupca", String.format("%.2f", log.getResult()));
            String final_result = String.format("%.2f", log.getResult());
                    ((TextView) convertView.findViewById(R.id.textAmount)).setText(final_result);
            return convertView;
        }
    }

这是我的dbQuery获取价格。我在Logs类中创建了这个。这里我根据字符串中的参数显示价格。

public Cursor getPrice() {
        Cursor cursor = db.query("Price", new String[]{"price_stump_kn", "price_stump_eur", "road_price_kn", "road_price_eur"}, "sort = ? AND grade = ? AND length = ? BETWEEN diameter_dg = ? AND diameter_gg = ?",
                new String[]{getSort_id(), getGrade(), getLength(), getDiameter(), getDiameter()}, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                Price price = new Price();
                price.setStumpPrice_kn(cursor.getString(0));
                price.setStumpPrice_eur(cursor.getString(1));
                price.setRoadPrice_kn(cursor.getString(2));
                price.setRoadPrice_eur(cursor.getString(3));
            } while (cursor.moveToNext());
        }
        return cursor;
    }

那么我应该如何在一个基本适配器(listview)中显示两个表的内容?

1 个答案:

答案 0 :(得分:0)

这取决于这两个表中的记录是如何相关的。您在Logs类(我认为是域类,而不是DAO)中包含数据库查询的说法,我怀疑您的类结构有点令人困惑。因此,我尝试为每种混合日志和价格的方法绘制一个类结构。

解决方案A:每个日志都连接到一个价格,两个数据都显示在一个项目中。

class LogDAO extends SQLiteOpenHelper {
...
   public Log getLogs(some selection parameters) {
      Get logs according to selection parameters, and for each log
         call getPrice(selection parameter according to log just found)
         log.setPrice(price just found)
   ...

现在,在您的适配器中,项目是日志,使用log.getPrice()您可以获得价格属性,并可以在适配器中自由混合日志和价格属性,以便在您的视图项目中显示它们。

解决方案B:有一个混合列表 - 一些项目是日志,其他项目是价格

关键是,您可以为每个项目动态决定在适配器中使用哪种布局。所以结构将是:

class LogPriceDAO extends SQLiteOpenHelper {
...
   public Object getLogsAndPrices(some selection parameters)
      Get logs and prices in some sequence, according to your business
      logic and the selection parameters (If logs and prices have some
      common superclass, use that instead of Object)
...

class LogsAndPricesAdapter extends BaseAdapter {
...
   @Override
   public View getView (int i, View view, ViewGroup viewGroup) {
      ...
      Object currObject = this.getItem(i); // or common superclass
      ...
      View v;
   if (currObject instanceOf Log) {
      v = layoutInflater.inflate(R.layout.log_layout, null)
      now fill fields of your log layout
      ...
   } else {
      if (currObject instanceOf Price) {
         v = layoutInflater.inflate(R.layout.price_layout, null)
         now fill fields of your price layout
         ...
   return v

某些人认为instanceOf运营商的风格很差。因此,完美无瑕的方法是为LogPrice定义一个公共超类,它提供一个操作public Boolean isLog(),调用者可以从中确定它所获得的对象类型。