2015-10-02 3 views
1

Я создаю собственный класс, в котором я связать Курсор (заполняются значениями, извлеченных из базы данных SQLite) до AutoCompleteTextView, с ArrayAdapter. Каждая запись, извлеченная из Cursor, представлена ​​ID и значением , и она добавляется в ArrayAdapter по значению. Добавляя значения, я также создаю два массива ArrayList для отслеживания как идентификаторов, так и значений.Android AutoCompleteTextView: получить позицию элемента

Я хотел был бы получить выбранное положение позиции, но я реально не могу сделать его, даже с onItemClick слушателем.

Здесь некоторый код из моего пользовательского класса:

private AutoCompleteTextView field; 
private String column; 
private Activity activity; 
private ArrayList<String> list_id, list_values; 

//Constructor 
public PopulateAutoComplete(int elementFromLayout, String column, Activity activity) { 
    this.field = (AutoCompleteTextView) activity.findViewById(elementFromLayout); 
    this.activity = activity; 
    this.column = column; 
} 
//Reset two lists associated to actual element 
private void initializeLists() { 
    list_id= new ArrayList<>(); 
    list_values= new ArrayList<>(); 
} 
//Populating methods 
public void populate(Cursor cursor_total, String column_id, String column_values) { 
    initializeLists(); 
    int i=0; 
    String id = null; 
    String value = null; 
    cursor_total.moveToFirst(); 
    do { 
     id = cursor_total.getString(cursor_total.getColumnIndex(column_id)); 
     value = cursor_total.getString(cursor_total.getColumnIndex(column_values)); 
     list_id.add(i,id); 
     list_values.add(i,value); 
     i++; 
    } while (cursor_total.moveToNext()); 
    adapter = new ArrayAdapter<>(activity,android.R.layout.simple_dropdown_item_1line, list_values); 
    field.setAdapter(adapter); 
} 
//Method which select the right item from the list 
public void selectValue(Cursor cursor_single, String column_value_to_select) { 
    String id_to_verify = cursor_single.getString(cursor_single.getColumnIndex(column_value_to_select); 
    loop: { 
     for (int i=0; i<listaID.size(); i++) { 
      if (list_id.get(i).equals(id_to_verify)) { 
       adapter.getItem(i); 
       field.setText(list_values.get(i)); 
       break loop; 
      } 
     } 
    } 
    setListener(); 
} 
private void setListener() { 
    field.setOnItemClickListener(listener); 
} 
private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     //How to get ID of selected item here? 
    } 
}; 

А вот это код из моего MainActivity:

PopulateAutoComplete element = new PopulateAutoComplete(R.id.element, "column", this); 
element.populate(cursor,"id","name"); 
element.selectValue(cursor_single,"id"); 

Я хотел бы иметь идентификатор выбранного элемента , поэтому я могу использовать list_id.getItem (позиция).

Я попытался с field.getListSelection(), list_id.indexOf (adapterView.getSelectedItem()) но это не было полезно. Я также знаю, что некоторые из этих методов связаны с фактическим выпадающим списком, но мне нужен метод, который извлекает точное положение элемента в ArrayAdapter; таким образом, я могу автоматически извлекать ID и значения (обратите внимание: значения не уникальны).

EDIT # 1:

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     adapterView.getSelectedItemPosition(); //It returns "-1" 
     i; //It returns a result depending on actual shown dropdown list. If I have a list of 200 item and I have 1 item shown on the dropdown, position will be always 0 
    } 
}; 
+0

курсора и ArrayAdapter? Зачем? почему вы не используете SimpleCursorAdapter? см. [здесь] (http://stackoverflow.com/a/19860624/2252830) для получения более подробной информации – pskink

+0

list_id.indexOf (adapterView.getSelectedItem()) не будет работать здесь, потому что list_id - это список идентификаторов (строк), в то время как getSelectedItem() возвращает объект, представляющий данные текущего выбранного элемента в списке (возможно, значение, потому что это то, что вы пересылаете к вашему адаптеру в его конструкторе). Вы хотите, возможно, getSelectedItemPosition(), но есть более немедленное решение. См. Мой ответ ниже. – logcat

+0

@pskink: Я собираюсь попробовать SimpleCursorAdapter, потому что я полагаю, что это лучший способ управлять данными курсора; кстати, целесообразно ли использовать AutoCompleteTextView? – Flash

ответ

-1

Попробуйте решение здесь. Я предполагаю, что то же самое значение, не может появиться дважды в списке данных (например, вы не можете иметь «item1» дважды в list_values:

how to find the position of item in a AutoCompletetextview filled with Array

+0

Кстати, почему вы используете arraylist.add (i, id) и arraylist.add (i, value)? Я вижу, что вы увеличиваете i на 1 на каждой итерации, а элементы поддерживаются в порядке вставки, поэтому вы можете просто использовать add (id) и add (value). – logcat

+0

О _list_id.get (i) внутри onItemClick() _, я попробовал, но он показывает результат в зависимости от выпадающего списка, но не в зависимости от всего списка. Итак, если я ищу конкретный элемент, он всегда возвращает _i = 0_, потому что это первый элемент в моем фактическом выпадающем списке, к сожалению. В этом суть моей проблемы: наличие позиции onItemClick на основе фактического раскрывающегося списка, а не всего списка. Что касается индексации, вы правы, я собираюсь удалить эту итерацию, спасибо (я думаю, что я добавил ее только для дальнейшей безопасности) – Flash

0

Это мое окончательное решение Благодаря pskink. для поддержки

Методы AutoCompleteTextView пользовательского класса:.

//1) Insert all the elements into the AutoCompleteTextView 
public void populate(String tag, String column_shown) { 
    this.TAG = tag; //I use a tag in order to differentiate queries I need to execute 
    this.column_value =column_shown; 
    String[] from = {column_shown}; 
    int[] to = {android.R.id.text1}; 
    cursorAdapter = new SimpleCursorAdapter(activity, android.R.layout.simple_dropdown_item_1line, null, from ,to, 0); 
    setSearchFilter(); 
    cursorAdapter.setStringConversionColumn(1); 
    field.setAdapter(cursorAdapter); 
} 
//2) Specify which query to use during the auto-complete step (while typing) 
private void setSearchFilter() { 
    FilterQueryProvider provider = new FilterQueryProvider() { 
     @Override 
     public Cursor runQuery(CharSequence constraint) { 
      System.out.println("PAC - runQuery: " + constraint); 
      if (TextUtils.isEmpty(constraint)) { 
       return null; 
      } 
      String[] params = {"%" + constraint.toString() + "%"}; 
      //Different queries for different tags 
      switch (TAG) { 
       case ("report"): { 
        Cursor c = db.getReport(column_value, params); 
        //db is an istance of a Custom Class for SQLiteDatabase 
        return c; 
       } 
      } 
      return null; 
     } 
    }; 
    cursorAdapter.setFilterQueryProvider(provider); 
} 
//3) Method to select the correct value while loading Activity for the first time. The value is taken from DB 
public void selectValue(Cursor c) { 
    if (c==null) { 
     return; 
    } 
    if (c.getCount()==0) { 
     return; 
    } 
    String id_to_verify = c.getString(c.getColumnIndex(column_id)); 
    setID(id_to_verify); //I need this to take memory of actual record ID 
    field.setText(c.getString(c.getColumnIndex(column_value))); //field is an instance of AutoCompleteTextView custom class 
} 

Методы SQLiteDatabase изготовленный под заказ класс. Это было важной частью моей проблемы: мне нужно указать столбец _id внутри моего запроса, чтобы получить методы работы.

public Cursor getReport(String column, String params[]) { 
    String query = "SELECT id AS _id, name FROM customers WHERE " + column + " LIKE ? ORDER BY name ASC;"; 
    return db.rawQuery(query,params); 
} 

Методы MainActivity:

private PopulateAutoComplete customer; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //... 
    Cursor cursorCustomer = `...`; //Used to find actual value on Activity loading 
    customer = new PopulateAutoComplete(R.id.customer,"id_customer",db,this); 
    customer.populate("report", "name"); 
    customer.selectValue(cursorCustomer); 
} 
Смежные вопросы