1

我爲高級搜索創建了一個全屏對話框片段。它有一個回收者視圖和一個微調器,爲回收者視圖添加元素。每個項目在右上角都有一個EditText,一個微調框和一個關閉按鈕(抱歉,我必須爲關閉按鈕選擇另一個圖標)。根據我選擇的選項(某些選項是日期),在微調器「添加過濾器」上,該項目的編輯文本可能會附帶或不附帶DatepickerDialog。 我的問題是。 在方法「addEditext」我設置「viewHolder.texto.setFocusable(false);」所以它唯一可能的在該Edittext中設置日期,但在「onBindviewHolder」我設置「viewHolder.texto.setFocusable(true);」它不工作,當我添加一個日期EditText過濾器,我刪除它,後來添加另一種EdittText Ediitext不可聚焦。檢測項目時recyclerview中的Edittext不可聚焦

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

}; 

回答

0

RecycleView的想法是,它一旦回收ViewHolders作爲了他們不需要。這提高了整體性能。其缺點是,你必須「復位」ViewHolder每個onBindViewHolder通話的狀態,否則這個循環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))onBindViewHolder方法。

+0

@ Tico1993我已經修改了答案,以便提供一些見解如何實現它。切換到ListView需要相同的方法。 – MeliX

+0

我設置爲edittext的OnClickListeners事件會改變嗎?我遇到的另一個問題是,當我刪除一個項目時,只需刪除該項目的位置的項目也需要我在已刪除項目上設置的事件 – Tico1993

+0

@ Tico1993是的,您是對的。你也應該在你的'onBindViewHolder'中調用'viewHolder.texto.setOnClickListener(null);'。 – MeliX

相關問題