Sabari Karthik Ответов: 1

Каскадные блесны в android


Привет Друзья,
Я не знаком с разработкой android,и я столкнулся с ситуацией каскадного выпадающего списка на основе выбора первого прядильщика.то есть,рассмотрим для примера в 1-м прядильщике все данные состояний загружаются из веб-сервиса с помощью вспомогательного класса db при выборе имени состояния в 1-м прядильщике мне нужно заполнить 2-й прядильщик на основе идентификатора выбранного элемента 1-го прядильщика(stateid не тот идентификатор выбранного элемента spinner) из БД, что означает, что мне нужно выбрать stateid из выбранного состояния и хочу отфильтровать районы на основе состояний.
Создание таблицы состояний:
CREATE TABLE States( StateID INTEGER , StateName VARCHAR)

Создание таблицы округов:
CREATE TABLE Branches(_ID INTEGER PRIMAY KEY,DistrictName VARCHAR,StateID INTEGER)


В этом случае я использовал для загрузки данных для состояний с помощью arraylist и on spinner1.setOnItemSelectedListener функция загрузила значения района, но значения загружаются в соответствии с положением элементов в счетчике состояний, а не то, что мне нужно фильтровать на основе stateid в таблице ветвей.

Это код для получения всех состояний:
public ArrayList<HashMap<String, String>> getStatesData() {
		ArrayList aList = new ArrayList();
		try {
			Log.e("getStatesData", "Started");
			String selectQuery = "SELECT * FROM States";
			SQLiteDatabase database = this.getWritableDatabase();
			Cursor cursor = database.rawQuery(selectQuery, null);
			if (cursor.moveToFirst()) {
				do {
					HashMap<String, String> map = new HashMap<String, String>();
					map.put("StateID",
							cursor.getString(cursor.getColumnIndex("StateID")));
					map.put("StateName", cursor.getString(cursor
							.getColumnIndex("StateName")));
					aList.add(map);

				} while (cursor.moveToNext());
			}
			cursor.close();
			return aList;

		} catch (Exception e) {
			e.printStackTrace();
			Log.e("getStatesData", "Ended");
			return aList;
		}
	}



spinner1.setonitemselectedlistner событие:

spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {

          @Override
          public void onItemSelected(AdapterView<?> adapt, View v,
                  int pos, long id) {
              // TODO Auto-generated method stub

              long spinstate=spinner_state.getSelectedItemId();
      branch_values=sDBController.getStateselectidData(spinstate);
      branch_name_ary.clear();
      for (int i = 0; i < branch_values.size(); i++) {
          String name=branch_values.get(i).get("DistrictName");
          String id=branch_values.get(i).get("StateID");
          branch_name_ary.add(name);
          Log.e("branchesbystates", branch_name_ary.toString());
      }
      ArrayAdapter<String> spinnerArrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, branch_name_ary);
      spinnerArrayAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      spinner_district.setAdapter(spinnerArrayAdapter1);
          }

          @Override
          public void onNothingSelected(AdapterView<?> arg0) {
              // TODO Auto-generated method stub

          }
      });


Пожалуйста, предложите какое-то решение, чтобы получить районы на основе stateid, которое может помочь получить представление о решении этой проблемы.

Заранее спасибо.

1 Ответов

Рейтинг:
1

David Crow

Несколько лет назад я сделал нечто подобное в приложении для налога с продаж. Обрезка жирных листьев что-то вроде:

// how the two tables are created
private static final String STATES_TABLE_CREATE =
    "CREATE TABLE " + STATES_TABLE + " ("
        + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + KEY_NAME + " TEXT);";

private static final String COUNTIES_TABLE_CREATE =
    "CREATE TABLE " + COUNTIES_TABLE + " ("
        + KEY_ID + " INTEGER REFERENCES " + STATES_TABLE + "(" + KEY_ID + "), "
        + KEY_NAME + " TEXT);";
...
class Info
{
    public long lStateId;
    public String sName;

    public Info( long lStateId, String sName )
    {
        this.lStateId = lStateId;
        this.sName    = sName;
    }

    @Override
    public String toString()
    {
        return sName;
    }
}
...
// populating the State spinner
ArrayList<Info> states = new ArrayList<Info>(50);
ArrayList<Info> counties = new ArrayList<Info>();

db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(DatabaseHelper.STATES_TABLE, new String[]{DatabaseHelper.KEY_ID, DatabaseHelper.KEY_NAME}, null, null, null, null, DatabaseHelper.KEY_NAME);
if (cursor.moveToFirst())
{
    do
    {
        long lId = cursor.getLong(cursor.getColumnIndex(DatabaseHelper.KEY_ID));
        String sName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_NAME));

        states.add(new Info(lId, sName));

    } while (cursor.moveToNext());

    cursor.close();
}

db.close();
...
// respond to a selected State
@Override
public void onItemSelected( AdapterView<?> parent, View view, int position, long id )
{
    Info i = states.get(position);

    counties.clear();

    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query(DatabaseHelper.COUNTIES_TABLE,
                             new String[]{DatabaseHelper.KEY_ID, DatabaseHelper.KEY_NAME},
                             DatabaseHelper.KEY_ID + " = ?",
                             new String[]{String.valueOf(i.lStateId)},
                             null,
                             null,
                             DatabaseHelper.KEY_NAME);

    if (cursor.moveToFirst())
    {
        do
        {
            long lId = cursor.getLong(cursor.getColumnIndex(DatabaseHelper.KEY_ID));
            String sName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_NAME));

            counties.add(new Info(lId, sName));

        } while (cursor.moveToNext());

        cursor.close();
    }

    if (counties.size() == 0)
        counties.add(new Info(-1, "No counties found for the selected state"));

    adapterCounties.notifyDataSetChanged();
    db.close();
}
Это должно приблизить вас к тому, что вы ищете.