1

У меня есть AutoCompleteTextView, который использует для поиска значения из базы данных. По щелчку отфильтрованного значения установлено значение AutoCompleteTextView, которое может использоваться для обновления значения для конкретных данных.Как удалить данные из AutoCompleteTextView с адаптером напрямую

Я хотел бы добавить delete ImageView functionallity рядом с фильтрованным элементом. В диалоговом окне «Щелчок этого предупреждения» следует удалить или нет. Был способен разработать сценарий.

MyCursorAdapter adapter = new MyCursorAdapter(this, R.layout.edt_delete_item, null, fromName, to); 
searchText.setAdapter(adapter); 


adapter.setCursorToStringConverter(new CursorToStringConverter() { 
      @Override 
      public String convertToString(android.database.Cursor cursor) { 
       // Get the label for this row out of the "state" column 
       //final int columnIndex = cursor.getColumnIndexOrThrow("state"); 
       int index = cursor.getColumnIndex(DBConstant.Patient_Name_Columns.COLUMN_NAME); 
       String strName = ""; 
       if(index != -1) 
       { 
        strName = cursor.getString(index); 
       } 
       return strName; 
      } 
     }); 

QueryFilter был использован на заказ адаптер: -

adapter.setFilterQueryProvider(new FilterQueryProvider() { 
public Cursor runQuery(CharSequence constraint) { 
    Cursor cursor = getContentResolver().query(DBConstant.Patient_Name_Columns.CONTENT_URI, null,DBConstant.Patient_Name_Columns.COLUMN_NAME_SEARCHALGO + " like '%" + SearchAlgo.getNameSearchAlgo(constraint.toString())+"%'", null, "0"); 
       return cursor; 
      } 
     }); 

Пользовательский адаптер: -

public class MyCursorAdapter extends SimpleCursorAdapter{ 
    public MyCursorAdapter(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    //get reference to the row 
    View view = super.getView(position, convertView, parent); 
    //check for odd or even to set alternate colors to the row background 
    if(position % 2 == 0){ 
     view.setBackgroundColor(Color.rgb(238, 233, 233)); 
    } 
    else { 
     view.setBackgroundColor(Color.rgb(255, 255, 255)); 
    } 
    return view; 
    } 
} 

Адаптер AutoCompleteTextView имеет компоновку, как показано ниже в edt_delete_item, имеющий ImageView с удалить.

При щелчке адаптера он устанавливается в AutoCompleteTextView -> SearchText.

What UIx looks like

Я уже обработан OnClick слушатель ImageView.

Трудно получить id данных, которые подаются в адаптер.

Могу ли я удалить данные адаптера с помощью этого ImageView?

Согласно предложению, как установить идентификатор курсора в теге ImageView? Как курсор бросает CursorIndexOutOfBoundException при прохождении его MyCustomAdapter

+0

Там ничего не мешает вам передать как тег для 'ImageView' идентификатор строки из 'Cursor' (в методе' getView() '). Затем вы можете получить его в 'onClick()' с помощью 'v.getTag()'. – Luksprog

+0

@Luksprog: Там, где вы направляете, звучит идеальный путь. Но я не понимаю, как установить тег из курсора в этот ImageView. –

+0

В методе 'getView()' (или 'bindView()') вашего пользовательского адаптера извлекается идентификатор из 'Cursor'. Установите этот идентификатор как тег для 'ImageView',' imageView.setTag (Long.valueOf (idFromCursor)). – Luksprog

ответ

1

Как было предложено Luksprog setTag и getTag путь для достижения этой цели я хочу. Установка тега в getView() within <kbd>ImageView</kbd> и получение тега back onClick - это правильный выбор для выполнения операции.

Изменен getView() CustomAdapter, который распространяется на SimpleCursorAdapter.

Фрагмент кода: -

public View getView(int position, View convertView, ViewGroup parent) { 
    // get reference to the row 
    View view = super.getView(position, convertView, parent); 
    // check for odd or even to set alternate colors to the row background 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.edt_delete_item, null); 

    getCursor().moveToPosition(position); 

    long id = getCursor().getLong(getCursor().getColumnIndex(DBConstant.Patient_Name_Columns.COLUMN_ID)); 

    TextView name = (TextView)view.findViewById(R.id.txtText); 
    ImageView delete = (ImageView) view.findViewById(R.id.deleteIcon); 

    String strName = getCursor().getString(getCursor().getColumnIndex(DBConstant.Patient_Name_Columns.COLUMN_NAME)); 

    name.setText(strName); 

    delete.setTag(String.valueOf(id)); 
    return view; 
    } 

OnClickListener из ImageView обрабатывались опцию удаления: -

boolean d = false; 
    String _id = v.getTag(); //v is the view in here i.e ImageView in my case. 
    d= SmartConsultant.getApplication().getContentResolver().delete(DBConstant.Patient_Name_Columns.CONTENT_URI, "_id=?", new String[] { _id }) > 0; 
    if(d) 
    { 
     //Show Toast Successfully deleted. 
    } 
+0

Я получаю 'NullPointerException', поскольку тег не был установлен в' getView() 'Custom Adapter. Я использовал newView вместо getView, но нет такой разницы. Могли бы, пожалуйста, рассказать мне, что я делаю неправильно? –

+1

@VikalpPatel Извините, я имел в виду метод ** bindView() '**, метод' newView() 'не вызывается для каждой строки. Я не знаю, почему это исключение выбрано, где вы устанавливаете слушателя для «ImageView»? – Luksprog