来自ArrayList的Android名称值对

时间:2011-12-20 23:47:17

标签: android arraylist

在下面的代码中,我能够检索每条记录的_id value并将其与ListView中的文本一起显示,但是当我从列表中选择一个项目时,返回的值为0到N取决于结果在列表中的排列方式。

我如何得到_id value,我想作为一个命名值对,这样当选择0或1 ...时,它输出_id字段而不是0或1 ......用于{{1 }}

这是我的方法,它很乱,一旦我开始工作,我会尝试改进它!

OnItemClickListener

这是我的OnItemClickListener方法

private void GetCoordinates(double currentLatitude, double currentLongitude) {

    List<String> ar = new ArrayList<String>();

    dbBookHelper = new DatabaseHelper(this);
    ourCursor = dbBookHelper.getCoordinates();

    int counta = 0; 
    ourCursor.moveToFirst();                    
    do {                    
        id = ourCursor.getInt(ourCursor.getColumnIndex("_id"));
        BeachName = ourCursor.getString(ourCursor.getColumnIndex("BeachName"));
        beachLatitude = ourCursor.getDouble(ourCursor.getColumnIndex("latitude"));
        beachLongitude = ourCursor.getDouble(ourCursor.getColumnIndex("longitude"));

        distence = ConvertDistance(beachLatitude, beachLongitude);

        if (distence <= 5) {
            ar.add(id + " " + BeachName + " - " + distence + "Kms");
            counta++;               
        }

    } while (ourCursor.moveToNext());

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row2, R.id.beachListText, ar);
    setListAdapter(adapter);

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    lv.setOnItemClickListener(onListClick);

    Toast.makeText(getBaseContext(), "There are " + String.valueOf(counta) + " beaches within a 5km radius!", Toast.LENGTH_LONG).show();        
}

非常感谢任何帮助,

干杯,

麦克

编辑:谢谢大家,我也希望有一个更光滑的方式!

但我现在有第二个数组只包含id值,

private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    {           
        Toast.makeText(getBaseContext(), String.valueOf(id) + " selected", Toast.LENGTH_LONG).show();
    }
};

所以位置是一样的,但是如何让它们进入OnItemClickListener呢?我想在这里某处???

ar1.add(String.valueOf(id));

1 个答案:

答案 0 :(得分:1)

基本问题是ArrayAdapter对Cursor或rowId一无所知。我认为你有两个选择。第一种是自己管理数组位置到rowId的映射。例如,创建第二个数组以将ArrayList位置映射到rowId,并在侦听器中执行简单查找。

如果由于某种原因这不合适,那么你可以通过扩展CursorAdapter来创建一个具有Cursor知识的自定义适配器。它涉及覆盖2个方法newView()和bindView()来分配和填充将在每行中显示的视图(使用您的自定义字符串)。它还提供了过滤钩子,允许您实现&lt;你需要的5KM过滤器。

我自己没有经历过这个特殊情况,但是最近我必须扩展一个ArrayAdapter来实现一个很长的列表的SectionIndexer。虽然这是一项有价值的练习,但我认为在您的情况下,自定义适配器可能有点过分。第二个阵列查找可能更简单,更合适。

1)使您的新数组成为类成员,以便在侦听器中访问它

ArrayList<Long> mIdArr = null;

2)以与String数组类似的方式创建它

mIdArr = new ArrayList<Long>();

3)将rowId存储在您添加到String数组

的同一点
ar.add(id + " " + BeachName + " - " + distence + "Kms");
mIdArr.add(new Long(id));

4)像你一样在你的监听器中检索Id

private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    {           
        Long rowId = mIdArr.get(position);
        Toast.makeText(getBaseContext(), String.valueOf(rowId) + " selected", Toast.LENGTH_LONG).show();
    }
};