1

高度な検索のための全画面ダイアログフラグメントを作成しました。それはリサイクラービューとそのリサイクラービューに要素を追加するSpinnerを持っています。すべてのアイテムには、右上にEditText、スピナー、閉じるボタンがあります(申し訳ありませんが、閉じるボタンには別のアイコンを選択する必要があります)。スピナーの "Add filter"で選択したオプション(日付のオプションの一部)に応じて、アイテムのEdittextにDatepickerDialogをアタッチするかどうかを指定できます。 私のprobleです。メソッド "addEditext"で を設定しました。 "viewHolder.texto.setFocusable(false);"を設定しました。そのEditTextの中でDateを設定することが可能ですが、 "onBindviewHolder"では "viewHolder.texto.setFocusable(true);"を設定します。私はDate EditTextでフィルタを追加すると、それを削除し、後でEdiitextがフォーカスできないEdittTextの別の種類を追加します。リサイクリングラーモアの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は、結合前の(とあまりにもOnClickListeners)からのデータが含まれていますので、あなたがに、各onBindViewHolderコールにViewHolderの状態を「リセット」しているということです。

最初のステップは、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); 

まだ、あなたが聞くためにあなたのEditTextTextWatcherを追加する必要があります状態変化のために。 私は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; 
     } 
    } 
} 
} 

は、あなたのonBindViewHolder方法でviewHolder.bind(lista_filtro.get(position))を呼び出すことを忘れないでください。

+0

@ Tico1993私はあなたがそれをどのように実装できるかについていくつかの洞察を提供するために答えを修正しました。 ListViewに切り替えるには、同じアプローチが必要です。 – MeliX

+0

私がedittextに設定したOnClickListenersイベントはどうなりますか?変更しますか?私が持っているもう一つの問題は、アイテムを削除すると、削除したアイテムの位置を取るアイテムも、削除したアイテムに設定したイベントになります。 – Tico1993

+0

@ Tico1993はい、そうです。あなたのonBindViewHolderで 'viewHolder.texto.setOnClickListener(null);'も呼び出すべきです。 – MeliX

関連する問題