View.getId() Всегда возвращайте один и тот же идентификатор в listview с шаблоном держателя

#android #listview

#Android #listview

Вопрос:

У меня есть Listview с EditText в каждой строке. Мне нужно получить идентификатор сфокусированной строки. В моем коде holder.valor.getId(); всегда возвращает один и тот же идентификатор. Я не понимаю, почему!

В другом действии я хочу увеличить edittext и изменить тип клавиатуры с помощью кнопки actionbar.

Вот мой код :

 public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    final String marca;
    final String producto;
    try {
        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.row_lista_form, null);

            holder.item = (TextView) convertView.findViewById(R.id.item);
            holder.valor = (EditText) convertView.findViewById(R.id.valor);
            holder.valor.setInputType(InputType.TYPE_CLASS_PHONE);
            holder.imgCam = (ImageView) convertView.findViewById(R.id.cambutton);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        marca = getlForm().get(position).getMarca();
        producto = getlForm().get(position).getProducto();
        final int proyectoproducto = getlForm().get(position).getProyectoProductoId();
        String valor = getlForm().get(position).getCantidad();
        if (valor == null || valor.equals("null"))
            valor = "";
        holder.item.setText(marca   "n"   producto);
        holder.valor.setText(valor);

        // Listener : If focus lost, we insert value in db
        holder.valor.setOnFocusChangeListener(new OnFocusChangeListener() {

            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    // update row
                    Formulario f = getlForm().get(position);
                    EditText et = (EditText) v;
                    f.setCantidad(et.getText().toString());
                    f.setSync(0);
                    FormHandler fh = new FormHandler(ctx);
                    boolean existForm = fh.existForm(f);
                    if (!existForm)
                        fh.addForm(f);
                    else
                        fh.updateForm(f);

                }else{
                    // We have the focus, we send the id in the prefs,
                    // to send it the change keyboard function
                    int editTextId = holder.valor.getId();
                    prefs.edit().putInt("metricaEtId", editTextId).commit();
                }

            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
    return convertView;
}
  

Ответ №1:

Используйте

 v.getId();
  

в

 onFocusChange(View v,....
  

Комментарии:

1. Я не знаю, зачем вам нужен идентификатор, если все равны, но если вы хотите узнать «позицию» textedit, которая была у него в getView(), затем «установите» эту позицию с помощью «edittext.setTag (position)» в getView() и извлеките с int position=v.getTag(); в onFocusChanged.

2. хорошо, но тогда я потеряю свою ссылку «держатель»: holder = (ViewHolder) convertView.getTag();

3. Конечно, нет. Вы можете оставить все то же самое. Вы должны понимать это, когда я предлагаю ‘edittext.setTag`, который переводится в getView в holder.valor.setTag .

4. Я не очень хорошо понимаю, но не вижу в этом смысла… В onFocusChanged у меня есть доступ к параметру положения. Так что нет никакой необходимости делать это. Затем я не знаю, как получить мой edittext из положения в моей деятельности…

5. У вас есть доступ к параметру позиции. Но это неправильное положение, когда меняется фокус. Протестируйте, и вы увидите. И протестируйте мой код. И ваш текст редактирования в onFocusChanged — это View v. Но этот код уже есть.