0

我有一个由 JSONObjects 膨胀的 ListView。它工作正常list.setOnItemClickListener。我使用 EditText 添加了搜索工具,并在运行时搜索 JSONArray 中的项目(包含 JSONObjects)。但是搜索后,当我单击 ListView 项时,它会显示 JSONArray 中的原始位置。例如,如果我有这些项目的 ListView。

Africa
Asia
Europe
North America
South America

[ListView中item的位置为0-4,即非洲=0,南美=4]

现在,如果我使用 EditText 字段作为搜索栏,然后输入America它,它现在将向我显示包含 2 个项目的列表视图。

North America
South America

现在ListView在运行时有两个项目,如果我点击North America它会告诉我JSONArray的位置[0],原来是Africa,所以,而不是向我North America显示关于它的信息/数据,我点击了Africa

如何从 ListView Click 中获取 JSONObject 但 position-id ?

/* 填充 ListView onCreate() */

public void populateCityList() {
    List<CityRowItem> rowItems;
    rowItems = new ArrayList<CityRowItem>();
    try {
        jArray = readJSONFile();
        if (jArray != null) {

            for (int i = 0; i < jArray.length(); i++) {
                JSONObject j1 = jArray.getJSONObject(i);
                CityRowItem item = new CityRowItem(R.drawable.grain,
                        j1.getString("city_name_eng"),
                        j1.getString("city_name_alias"), R.drawable.city);
                rowItems.add(item);
            }

            CityListAdapter myadapter = new CityListAdapter(
                    GetCityManual.this, R.layout.list_item_city, rowItems);
            list.setAdapter(null);
            list.setAdapter(myadapter);
                    }
    }
    catch (JSONException) {
        ;
    }
}

/* 这是 onClick 监听器 */

list.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
        try {
            JSONObject j1 = jArray.getJSONObject(position);                 
            String CityName = jsonObj.getString("city_name_eng");
            Intent myIntent = new Intent(GetCityManual.this,
                    GetCategory.class);
            myIntent.putExtra("objCity", CityName);
        }
        catch (JSONException e)
        { 
            ;
        }
    }
}

/* 这段代码反映了使用 EditText 进行搜索的功能 */

txtSearch.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // TODO Auto-generated method stub

    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    public void afterTextChanged(Editable s) {
        List<CityRowItem> rowItems;
        rowItems = new ArrayList<CityRowItem>();
        if (jArray != null) {
            try {
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject j1 = jArray.getJSONObject(i);
                    if (j1.getString("city_name_eng").toLowerCase()
                            .contains(s.toString().toLowerCase())) {
                        CityRowItem item = new CityRowItem(
                                R.drawable.grain, j1
                                        .getString("city_name_eng"), j1
                                        .getString("city_name_alias"),R.drawable.city);
                        rowItems.add(item);
                    }
                    CityListAdapter myadapter = new CityListAdapter(
                            GetCityManual.this,
                            R.layout.list_item_city, rowItems);
                    list.setAdapter(null);
                    list.setAdapter(myadapter);
                }
            }
            } catch (Exception _e) {
                ;
            }
}
}
4

2 回答 2

0

LIst 从实际列表适配器中传递您选择的位置,您更改了列表适配器,因此您可以从那里获得数字。你应该在别处保留原始位置

于 2012-11-01T14:36:47.517 回答
0

您的 onItemClick 显示您单击的列表的当前位置。你可以List<CityRowItem> CurrentRowItems;在你的班级和 init 和 afterTextChanged 上保留对该列表的引用 this.CurrentRowItems = rowItems;。当点击事件发生时CityRowItem city = this.CurrentRowItems.get(position);。另外我建议只对 json 文件进行一次解码,然后处理该列表。

于 2012-11-01T14:50:29.737 回答