Android spinner loads multicolumn (joined) Sqlite

2019-08-04 18:56发布

问题:

I am learning how to create a spinner that loads dropdown from SQLite. I have an UI that consists of a spinner and a table. If user clicks spinner, the table's content will load according to the database based on the selected ID on spinner. If name not selected, it will load all contents in table.. However I can't find the way how to make the table reload based on the ID / name selected on spinner. Anyone can guide me?

The table itself is a joined table, which has following structure:

Table A : ID_Person | Name | Age

Table B : ID_Account | ID_Person | Amount

Spinner shows Person's name. Meanwhile the table will show the following structure:

Name | Age | Amount

My code for spinner:

public List<String> getAllDealers()
{
    List<String> contentdealer = new ArrayList<String>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " +Dealer_TABLE;

    cursor = db.rawQuery(selectQuery, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            contentdealer.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }
    // closing connection
    return contentdealer;
}

Here is how I build my Table for looping:

    Cursor c = in.getViewInfo(); //method in db consists of query that i want table show

    int rows = c.getCount();
    int cols = c.getColumnCount();
    c.moveToFirst();

    // outer for loop
    for (int i = 0; i < rows; i++) 
    {
        //looping all rows based .getCount()
        //looping all columns
        for (int j = 0; j < cols; j++) 
          {
          }
    }
    in.close();

回答1:

See a similar but not exact same answer here

https://stackoverflow.com/a/11920785/1116836

I believe what you want is

spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        Toast.makeText(context, "item selected, load some sql", Toast.LENGTH_LONG).show();
        // position should match the index of the array in the items list you used for which item is selected, or here you could do
        String selected = spinner.getSelectedItem().toString();
        // or
        String anotherway = spinner.getItemAtPosition(position).toString();
        if (selected.equals("what ever the option was")) {

        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) 
    {
        Toast.makeText(context, "nothing selected, load some sql", Toast.LENGTH_LONG).show();
    }
});

likely to be able to select nothing, you will have to insert a view with no text, and allow that to be selected.

onNothinSelected is more for when a list is modified, or the currently selected item becomes unselected, e.g. when it is in in between selections it may call this method.

Callback method to be invoked when the selection disappears from this view. The selection can disappear for instance when touch is activated or when the adapter becomes empty.

So basically, when a new item is selected, call a method that loads some sql rows, clear your table and then display the new data.

EDIT: for comment

What you are trying to do is an event drive function. When someone selects a new option in the spinner, it is an event. You listen for this event by, as I showed above, implementing the OnItemSelectedListener().

One you implement this, you can find out what item is selected, as soon as it happens. Once a new item is selected, you need to determine what that item means you should do.

Once you have figured that out, run your SQL statement and query your database, load the data, set it in the adapter and then the user will see it.

If you are using a ListView, which you should be, then you need to clear the adapter to the ListView, and then add the new items.

You need to research ArrayAdapter, BaseAdapter, ViewHolder pattern, and ListView's.

A quick google search will have you up and running in no time.