在检测项目时,recyclerview中的Edittext无法调焦

时间:2017-04-05 16:27:06

标签: android android-edittext android-recyclerview recycler-adapter

我为高级搜索创建了一个全屏对话框片段。它有一个回收器视图和一个Spinner,可以为该回收器视图添加元素。每个项目都有一个EditText,一个微调器和一个右上角的关闭按钮(抱歉,我必须为关闭按钮选择另一个图标)。根据我在微调器上选择的选项(某些选项是日期)"添加过滤器"该项的Edittext可以附加一个DatepickerDialog。 我的问题是。 在方法" addEditext"我设置" viewHolder.texto.setFocusable(false);"所以它只能在Edittext中设置一个Date但是在" onBindviewHolder"我设置" viewHolder.texto.setFocusable(true);"并且它不起作用,当我添加一个带有Date EditText的过滤器时,我将其删除,然后添加另一种EditiText,Ediitext无法调焦。

@Override
    public void onBindViewHolder(Boarding_searchViewHolder viewHolder, final int position) {


        viewHolder.texto.setText(lista_filtro.get(position).getTexto());
        viewHolder.texto.setOnClickListener(null);
        viewHolder.texto.setFocusable(true);
        viewHolder.texto.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                //setting data to array, when changed
                // this is a semplified example in the actual app i save the text
                // in  a .txt in the external storage
                lista_filtro.get(position).setTexto(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });


        addFilterText(viewHolder, position);
        addSpinner( viewHolder, position);
        addCloseButton(viewHolder, position);

       // EditText aux= new EditText(viewHolder.itemView.getContext());
       // lista_textos.add(aux);
        //viewHolder.texto=lista_textos.get(position);
       addEditText(viewHolder, position);

    }


private void addEditText(final Boarding_searchViewHolder viewHolder, int position) {


        Date fecha= new Date();
     switch(lista_filtro.get(position).getFilter())
     {

         case ETD:
         case ETA:
         case AUTHORIZED_DATE:
             viewHolder.texto.setFocusable(false);
             final Calendar myCalendar = Calendar.getInstance();

             final Cambiafecha cambiarfecha= new Cambiafecha(fecha, viewHolder.texto);


             viewHolder.texto.setOnClickListener(new View.OnClickListener() {

                 @Override
                 public void onClick(View v) {
                     // TODO Auto-generated method stub
                     new DatePickerDialog(viewHolder.itemView.getContext(), cambiarfecha, myCalendar
                             .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                             myCalendar.get(Calendar.DAY_OF_MONTH)).show();
                 }
             });
             break;

     }

    }


class Cambiafecha implements DatePickerDialog.OnDateSetListener {

    Date fecha;
    EditText texto;
    public Cambiafecha(Date fecha, EditText texto)
    {
        super();
        this.texto=texto;
        this.fecha=fecha;
    }
    @Override
    public void onDateSet(DatePicker datePicker, int year, int month, int day) {


        fecha.setMonth(month);
        fecha.setDate(day);
        fecha.setYear(year);
        updateLabel();
    }

    private void updateLabel() {

        String myFormat = "dd/MM/yy"; //In which you need put here
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

        texto.setText(sdf.format(fecha));
    }

};

1 个答案:

答案 0 :(得分:0)

RecycleView的想法是,只要不再需要ViewHolders,它就会回收。{1}}。这提高了整体性能。缺点是您必须 “重置” 每个ViewHolder来电中onBindViewHolder的状态,否则这会被回收{{1}将包含来自先前绑定的数据(以及ViewHolder)。

第一步是清除OnClickListeners的先前状态,如下所示:

ViewHolder

但是,它将清除用户先前输入的所有数据。因此,您必须为所有数据实施临时存储。你已经拥有@Override public void onBindViewHolder(Boarding_searchViewHolder viewHolder, int position){ viewHolder.texto.setText(null); ... //Rest of your code } 项,这个项应该有一个州。 让我们说:

Filtro_boarding

然后,您将不得不改变:

class Filtro_boarding{
    //your code here
    String state;
}

viewHolder.texto.setText(null);

但是,您必须向viewHolder.texto.setText(lista_filtro.get(position).state); 添加TextWatcher才能收听状态更改。 我会将EditText更改为:

Boarding_searchViewHolder

不要忘记在public static class Boarding_searchViewHolder extends RecyclerView.ViewHolder implements TextWatcher { public Spinner spinner; public EditText texto; public TextView filtro; public ImageButton cerrar; private Filtro_boarding filter; public Boarding_searchViewHolder(View v) { super(v); filtro = (TextView) v.findViewById(R.id.filtro); spinner = (Spinner) v.findViewById(R.id.spinner); texto = (EditText) v.findViewById(R.id.texto); cerrar = (ImageButton) v.findViewById(R.id.boton); texto.addTextChangedListener(this); } void bind(Filtro_boarding filter) { this.filter = filter; } @Override public void beforeTextChanged(final CharSequence charSequence, final int i, final int i1, final int i2) { } @Override public void onTextChanged(final CharSequence charSequence, final int i, final int i1, final int i2) { } @Override public void afterTextChanged(final Editable editable) { if (filter != null) { if (editable != null) { filter.status = editable.toString(); } else { filter.status = null; } } } } 方法中致电viewHolder.bind(lista_filtro.get(position))