Пары значений имен Android из ArrayList - PullRequest
0 голосов
/ 21 декабря 2011

В следующем коде я могу получить _id value каждой записи и отобразить ее вместе с текстом в ListView, но когда я выбираю элемент из списка, возвращаемое значение от 0 до N, в зависимости от того, как результаты выложены в списке.

Как я могу получить _id value, я думаю, в качестве пары именованных значений, чтобы при выборе 0 или 1… выводилось поле _id, а не 0 или 1… для моих 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();        
}

А это мой метод OnItemClickListener

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();
    }
};

Любая помощь будет принята с благодарностью,

Приветствия

Mike.

Редактировать: Спасибо, ребята, я тоже надеялся на более приятный способ!

Но теперь у меня есть второй массив, содержащий только значения идентификатора, с

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

То есть позиции одинаковы, но как мне их поместить в OnItemClickListener? Я думаю, где-то здесь ???

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);

1 Ответ

1 голос
/ 21 декабря 2011

Основная проблема заключается в том, что ArrayAdapter ничего не знает о Cursor или rowId.Я думаю, у вас есть 2 варианта.Первый заключается в том, чтобы управлять отображением позиции массива в rowId самостоятельно.Например, создайте второй массив для сопоставления позиции ArrayList с rowId и выполните простой поиск в слушателе.

Если это по какой-то причине не подходит, вы можете создать собственный адаптер со знаниемКурсор, расширяя CursorAdapter.Он включает переопределение двух методов newView () и bindView () для выделения и заполнения представлений (с вашей пользовательской строкой), которые будут отображаться в каждой строке.Он также предоставляет ловушки фильтрации, которые позволят вам реализовать необходимый фильтр <5 КМ. </p>

Я сам не проходил этот конкретный случай, но недавно мне пришлось расширить 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();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...