我为高级搜索创建了一个全屏对话框片段。它有一个回收器视图和一个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));
}
};
答案 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))
。