BaseAdapter 中的 notifyDataSetChanged() 无法正常工作
notifyDataSetChanged() in BaseAdapter not working correctly
我有一个 ListView
和我的 Adapter
。在列表视图中,我实现了 AdapterView.OnItemClickListener
以了解正在触摸哪个项目,以便为我的列表中的每个项目启动自定义对话框。
当我关闭对话框时,我想更新列表中的项目
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();
}
});
}
}
}
还有我的适配器class:
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();
}
}
当我在我的 ClickListener
中调用我的 adapter.actualizarNombre(nombre);
时,当我关闭对话框时它会在我的 ListView
中正确更新。但是当它进入 elseif()
并且我调用 adapter.actualizarDuracionEntrenamiento(valor);
时,它正在执行但没有任何反应,最让我惊讶的是,如果我将 adapter.actualizarDuracionEntrenamiento(valor);
移动到 [=15= 的相同位置] 已正确更新。
你知道会发生什么吗?
我不会说你的语言,但在你的对话框的点击监听器中,当位置是 POSICION_DURACION_MI_ENTRENAMIENTO 时,你正在呼叫
adapter.actualizarDuracionEntrenamiento(valor);
而不是
adapter.actualizarDuracionMiEntrenamiento(valor);
我有一个 ListView
和我的 Adapter
。在列表视图中,我实现了 AdapterView.OnItemClickListener
以了解正在触摸哪个项目,以便为我的列表中的每个项目启动自定义对话框。
当我关闭对话框时,我想更新列表中的项目
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();
}
});
}
}
}
还有我的适配器class:
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();
}
}
当我在我的 ClickListener
中调用我的 adapter.actualizarNombre(nombre);
时,当我关闭对话框时它会在我的 ListView
中正确更新。但是当它进入 elseif()
并且我调用 adapter.actualizarDuracionEntrenamiento(valor);
时,它正在执行但没有任何反应,最让我惊讶的是,如果我将 adapter.actualizarDuracionEntrenamiento(valor);
移动到 [=15= 的相同位置] 已正确更新。
你知道会发生什么吗?
我不会说你的语言,但在你的对话框的点击监听器中,当位置是 POSICION_DURACION_MI_ENTRENAMIENTO 时,你正在呼叫
adapter.actualizarDuracionEntrenamiento(valor);
而不是
adapter.actualizarDuracionMiEntrenamiento(valor);