我的Application
有一个ListView
。在列表视图中,我已实现Adapter
以了解要触摸的项目,以便为列表中的每个项目启动自定义对话框。
当我关闭对话框时,我想更新列表中的项目
AdapterView.OnItemClickListener
我的Adapter类:
public class ClickListenerListPreferences implements AdapterView.OnItemClickListener {
private static final int POSICION_INFORMACION = 2;
private static final int MIN_VALUE_NUMBER_PICKER = 10;
private static final int MAX_VALUE_NUMBER_PICKER = 120;
private Context context;
private static ListSettingsViewAdapter adapter;
public ClickListenerListPreferences(Context ctx, ListSettingsViewAdapter pAdapter){
context = ctx;
adapter = pAdapter;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(position == ListSettingsViewAdapter.POSICION_NOMBRE){
View v = inflater.inflate(R.layout.dialog_text_view, null);
Button botonAceptar = (Button) v.findViewById(R.id.boton_aceptar);
Button botonCancelar = (Button) v.findViewById(R.id.boton_cancelar);
botonAceptar.setBackgroundResource(R.drawable.hover_selector);
botonCancelar.setBackgroundResource(R.drawable.hover_selector);
final EditText editText = (EditText)v.findViewById(R.id.editTextDialog);
AlertDialog.Builder builderDialog = new AlertDialog.Builder(context);
builderDialog.setView(v);
final AlertDialog dialog = builderDialog.show();
botonAceptar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sp = context.getSharedPreferences("preferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
String nombre = editText.getText().toString();
editor.putString("nombre", nombre);
boolean funciona = editor.commit();
adapter.actualizarNombre(nombre);
dialog.dismiss();
}
});
botonCancelar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
else if(position == ListSettingsViewAdapter.POSICION_DURACION_ENTRENAMIENTO || position == ListSettingsViewAdapter.POSICION_DURACION_MI_ENTRENAMIENTO){
View v = inflater.inflate(R.layout.dialog_number_picker, null);
SharedPreferences sp = context.getSharedPreferences("preferences", Context.MODE_PRIVATE);
final NumberPicker picker = (NumberPicker)v.findViewById(R.id.number_picker_dialog);
picker.setMinValue(MIN_VALUE_NUMBER_PICKER);
picker.setMaxValue(MAX_VALUE_NUMBER_PICKER);
if(position == ListSettingsViewAdapter.POSICION_DURACION_ENTRENAMIENTO) {
int duracion = sp.getInt("duracionEntrenamiento", 30);
picker.setValue(duracion);
}
else if(position == ListSettingsViewAdapter.POSICION_DURACION_MI_ENTRENAMIENTO){
int duracion = sp.getInt("duracionMiEntrenamiento", 30);
picker.setValue(duracion);
}
Button botonAceptar = (Button) v.findViewById(R.id.boton_aceptar);
Button botonCancelar = (Button) v.findViewById(R.id.boton_cancelar);
botonAceptar.setBackgroundResource(R.drawable.hover_selector);
botonCancelar.setBackgroundResource(R.drawable.hover_selector);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setView(v);
final AlertDialog dialog = builder.show();
botonAceptar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sp = context.getSharedPreferences("preferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if(position == ListSettingsViewAdapter.POSICION_DURACION_ENTRENAMIENTO) {
int valor = picker.getValue();
editor.putInt("duracionEntrenamiento", valor);
editor.commit();
adapter.actualizarDuracionEntrenamiento(valor);
}
else if(position == ListSettingsViewAdapter.POSICION_DURACION_MI_ENTRENAMIENTO){
int valor = picker.getValue();
editor.putInt("duracionMiEntrenamiento", valor);
editor.commit();
adapter.actualizarDuracionEntrenamiento(valor);
}
dialog.dismiss();
}
});
botonCancelar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
}
}
当我在public class ListSettingsViewAdapter extends BaseAdapter {
private static Vector<ItemPreference> itemsPreference;
private Context context;
private LayoutInflater inflater; //Para acceder al los elementos del list_item.xml
private final int PRIMER_SWITCH = 5; //Posicion en la lista del primer Switch
private final int SEGUNDO_SWITCH = 8; //Posicion en la lista del segundo Switch
public static final int POSICION_NOMBRE = 1;
public static final int POSICION_DURACION_ENTRENAMIENTO = 4;
public static final int POSICION_DURACION_MI_ENTRENAMIENTO = 7;
public ListSettingsViewAdapter(Context ctx, Vector<ItemPreference> pItemsPreference){
super();
context = ctx;
itemsPreference = pItemsPreference;
}
@Override
public int getCount() {
return itemsPreference.size(); //Cantidad de elementos dentro de la lista. Si no le damos la cantidad, la lista aparecera vacia
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Accedo al .xml del item de la lista que voy a inflar
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = null;
if(itemsPreference.elementAt(position).getTipoLayout() == 0){ //Layout 2 TextViews
v = inflater.inflate(R.layout.list_item_text_view, parent, false);
v.setTag(position);
TextView titulo = (TextView)v.findViewById(R.id.titulo);
TextView subtitulo = (TextView)v.findViewById(R.id.subtitulo);
titulo.setText(itemsPreference.elementAt(position).getTitular());
subtitulo.setText(itemsPreference.elementAt(position).getDescripcion());
}
return v;
}
public void actualizarNombre(String nombre){
itemsPreference.elementAt(POSICION_NOMBRE).setDescripcion(nombre);
notifyDataSetChanged();
}
public void actualizarDuracionEntrenamiento(int duracion){
itemsPreference.elementAt(POSICION_DURACION_ENTRENAMIENTO).setDescripcion(Integer.toString(duracion));
notifyDataSetChanged();
}
public void actualizarDuracionMiEntrenamiento(int duracion){
itemsPreference.elementAt(POSICION_DURACION_MI_ENTRENAMIENTO).setDescripcion(Integer.toString(duracion));
notifyDataSetChanged();
}
}
中呼叫我的adapter.actualizarNombre(nombre);
时,当我关闭对话框时,我的ClickListener
内的ListView
已正确更新。但当它进入elseif()
并且我调用adapter.actualizarDuracionEntrenamiento(valor);
时它正在执行但没有任何反应,最令我惊讶的是,如果我将adapter.actualizarDuracionEntrenamiento(valor);
移动到adapter.actualizarNombre(nombre);
的相同位置它已正确更新。
你知道可能会发生什么吗?
答案 0 :(得分:0)
我不说你的语言,但它似乎在对话框的点击监听器中,当你的位置是POSICION_DURACION_MI_ENTRENAMIENTO时,你正在调用
adapter.actualizarDuracionEntrenamiento(valor);
而不是
adapter.actualizarDuracionMiEntrenamiento(valor);