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