在下面的代码中,我能够检索每条记录的_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));
答案 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();
}
};