刷新TableLayout以显示插入的新行

时间:2020-07-28 19:51:44

标签: android android-tablelayout

背景

我已经在数据库中创建了一个Orders表,并分别通过两个活动CurrentOrdersNewOrders来操纵它。

CurrentOrders活动显示了TableLayout中存储在数据库中的当前订单。为了向表中添加新订单,我指定了一个按钮addOrders,单击该按钮将加载NewOrders活动。

CurrentOrders:

public class CurrentOrders extends AppCompatActivity {
    
    private TableLayout table;
    populateTable(Cursor records){
           
           TableRow row = new TableRow(this);
           TextView product = new TextView(this);
           TextView price = new TextView(this);        

           product.setText(records.getString(1));        
           price.setText(records.getString(2));          
           row.addView(product);
           row.addView(price);

           table.addView(row);
    } 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_current_orders);
        
        Cursor cursor = db.query("orders", null, null,
                null, null, null, null);  

        table = findViewById(R.id.tab);             

        while(cursor.moveToNext())                 
           populateTable(cursor);
    }

    public void addOrders(View view){
       startActivity(new Intent(getApplicationContext(), NewOrders.class));        
    } 
}

NewOrders活动的作用类似于表单,它具有一个TableLayout,其单元格/字段指定为EditText,以便用户键入要存储的订单。为了将订单保存在数据库中,我指定了一个提交按钮,单击该按钮可将EditText的值存储在数据库的Orders表中,然后返回到父活动(CurrentOrders)以显示所有数据库中的订单。

新订单:

public class NewOrders extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_orders);                        
    }

    public void submit(View view){
        
        TableLayout table = findViewById(R.id.newOrders);
        int count = table.getChildCount();
        
        for (int idx = 0; idx < count; idx++){

            TableRow row = (TableRow) table.getChildAt(idx);

            EditText product = (EditText) row.getChildAt(1);
            EditText price = (EditText) row.getChildAt(2);

            String productVal = product.getText().toString();
            double priceVal = Double.parseDouble(price.getText().toString());

            long result = db.insert(productVal, priceVal);           
        }
        Toast.makeText(this, "Saved.", Toast.LENGTH_SHORT).show();
         onBackPressed();
    }
}

问题:

除非重新加载CurrentOrders活动,否则我看不到插入新记录。我想显示所有记录(包括新记录),而不必重新加载活动。

1 个答案:

答案 0 :(得分:0)

最后创建了一个简单的解决方案:

首先,我们需要修改startActivity中的CurrentOrder,以使其从NewOrders活动中接收数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    
    // add newly added orders
    
    if (data != null) {
        String response = data.getStringExtra("newOrders");
        if (requestCode == RequestCode && resultCode == RESULT_OK && !response.isEmpty()){
            String[] orders = response.trim().split(" ");
            for (String order : orders) {
                // get new orders from the database
                Cursor records = db.query("orders", null, "id = ?", 
                                          new String[] {String.valueOf(id)},
                                          null, null, null);
                records.moveToNext();
                populateTable(records);
            }
        }
    }
}

然后在addOrders方法中,您需要用以下代码替换startActivity

startActivityForResult(new Intent(getApplicationContext(), NewOrders.class), 2);

现在开始进行NewOrders活动,我创建了一个字符串变量,用于存储新创建的订单的ID:

public class NewOrders extends AppCompatActivity {
    
    // created a string variable
    private String newOrdersId = "";

    // reset of the code

    public void submit(View view){
        
        // rest of the code
        
        for (int idx = 0; idx < count; idx++){
            
            // rest of the code 
            
            // record id's of orders inserted into the database
            newOrderId += result + " "; 
        }
        // reset of the code
    }
}

最后,您需要通过重写CurrentOrders这样的方法将数据发送到onBackPressed

@Override
public void onBackPressed(){
    Intent intent = getIntent();
    intent.putExtra("newOrders", newOrdersId);
    setResult(RESULT_OK, intent);
    finish();
}