基于android中先前的微调器选择填充微调器

时间:2014-08-18 05:13:31

标签: android web-services sqlite adt android-spinner

我不熟悉Android开发,我遇到了基于第一个微调器选择级联下拉列表的情况。考虑在第一个微调器中的示例所有状态数据是使用db帮助器类从Web服务加载的在第一个微调器中的状态名称我需要根据第一个微调器选择的项目的id(stateid而不是微调器的所选项目ID)来填充第二个微调器,这意味着我需要从中选择一个选定的州,并希望根据州过滤地区。 状态表创建: CREATE TABLE States( StateID INTEGER , StateName VARCHAR)区域表创建:CREATE TABLE Branches(_ID INTEGER PRIMAY KEY,DistrictName VARCHAR,StateID INTEGER)

在这里,我习惯使用arraylist加载状态数据,并在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

        }
    });

请建议一些解决方案,以便根据州议定书获取地区,这可能有助于让想法解决问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果我是你,我会创建一个像这样的国家

public class State {
private String id;
private String name;

public State(String id, String name) {
    this.id = id;
    this.name = name;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return name;
}

}

并且getStatesDate方法将是这样的:

public List<State> getStatesData()
{
    List<State> states = new LinkedList<State>();
    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>();
                String stateId = cursor.getString(cursor.getColumnIndex("StateID"));
                String stateName = cursor.getString(cursor.getColumnIndex("StateName"));
                states.add(new State(stateId, stateName));

            } while (cursor.moveToNext());
        }
        cursor.close();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("getStatesData", "Ended");
    }

    return states;
}

并且spinner1 onClicklistener也将如下:

spinner1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            State state = (State) spinner1.getSelectedItem();

            String stateId = state.getId();
            String stateName = state.getName();

            //you are very assured that the id matches the name selected and you can proceed from there
        }
    });

我希望它有所帮助。干杯

答案 1 :(得分:0)

最好的选择是使用“开关盒”,如下所示:

int spinner = 0;
String bereichlink ="";
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    int spinnerId = getView(position, v, parent).getId();
    searchstring = sstr.getText().toString();
    switch (parent.getId()) {
        case R.id.REditText:
            if (position > 0) {
                spinner = position;
                Link = links[position];
                spinner2 = (Spinner) findViewById(R.id.sp_bereich);
                adapter2 = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, Constants.bereich[position - 1]);
                spinner2.setAdapter(adapter2);
                adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                new FetchFeedTask().execute((Void) null);
                spinner2.setSelection(0);
            }
            break;
        case R.id.sp_bereich:
            if (position >= 0) {                
                bereichlink = Constants.bereich[spinner-1][position];
                new FetchFeedTask().execute((Void) null);
            }
            bereichlink = "";
            break;
    }
    if ((spinner > 0) && (position > 0)) {
         ...

}

以“链接”和“ Bereich”作为常量枚举类型数组