ListFragment notifyDataSetChanged引发java.lang.NullPointerException

时间:2017-10-08 00:29:51

标签: java android

你好吗?我正在使用SQLiteListFragment和更多内容开发应用。这是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements 
SearchView.OnQueryTextListener, FragmentoResultados.Puente {

SearchView simpleSearchView;
FragmentoResultados fr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    simpleSearchView = (SearchView) findViewById(R.id.simpleSearchView); //initiate a search view
    simpleSearchView.setOnQueryTextListener(this);

    FragmentoResultados fr = (FragmentoResultados) getSupportFragmentManager()
            .findFragmentById(R.id.fragmentoResultados);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    /*MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);*/

    //Asociar configuración searchable con el SearchView
    /*SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));*/

    return true;
}

public void medidasGenerales(View v){
    Intent intent = new Intent(this, MedidasGeneralesPA.class);
    startActivity(intent);
}


@Override
public boolean onQueryTextSubmit(String query) {
    Aplicacion aplicacion = Aplicacion.getInstancia(getApplicationContext());
    ArrayList<String> listaCasos = aplicacion.getNombresCasos(query);//Se obtienen de la base de datos el listado de casos
                                                                    //de acuerdo a las palabras ingresadas en el SearchView

    if (fr != null){//Si fr ya esta inicializado
        fr.llenarListaCasos(listaCasos);
        return true;
    } else {
        fr = new FragmentoResultados();
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        transaction.replace(R.id.fragmentoResultados, fr);
        transaction.addToBackStack(null);
        fr.llenarListaCasos(listaCasos);
        return true;
    }
}

@Override
public boolean onQueryTextChange(String newText) {
    return false;
}

@Override
public void casoAMostrar(String nombreCaso) {

}

}

FragmentoResultados.java

public class FragmentoResultados extends ListFragment{

Puente activity;
ArrayList<String> listaCasos;
ArrayAdapter<String> adapter;


public interface Puente {

    public void casoAMostrar(String nombreCaso);
}

public FragmentoResultados() {
    // Required empty public constructor
}

public static FragmentoResultados newInstance(String param1, String param2) {
    FragmentoResultados fragment = new FragmentoResultados();
    return fragment;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    //Para verificar si la activity que contiene al fragmento
    //ha implementado la interfaz Puente
    try{
        activity = (Puente) context;
    }catch (ClassCastException e){
        throw new ClassCastException(context.toString()
                + "debe implementar la intefaz Puente");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragmento_resultados, 
container, false);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    listaCasos = new ArrayList<String>();
    adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1,
                listaCasos);
    setListAdapter(adapter);

}

@Override
public void onListItemClick(ListView l, View v, int position, long id) 
{//Enviar a la activity el item seleccionado
    activity.casoAMostrar(listaCasos.get(position));
}

public void llenarListaCasos(ArrayList<String> listaCasos){
    listaCasos = listaCasos;

    if (adapter == null)
        adapter = (ArrayAdapter) getListAdapter();

    adapter.notifyDataSetChanged();


}

}

然后,当我更新listaCasos的数据时,应用程序会抛出此错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference
                                                 at com.primerosauxilios.udec.appprimerosauxilios.vista.fragmentos.FragmentoResultados.llenarListaCasos(FragmentoResultados.java:87)
                                                 at com.primerosauxilios.udec.appprimerosauxilios.vista.activities.MainActivity.onQueryTextSubmit(MainActivity.java:71)
                                                 at android.support.v7.widget.SearchView.onSubmitQuery(SearchView.java:1241)
                                                 at android.support.v7.widget.SearchView$9.onEditorAction(SearchView.java:1218)
                                                 at android.widget.TextView.onEditorAction(TextView.java:4903)
                                                 at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
                                                 at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:372)
                                                 at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:93)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:154)
                                                 at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

如您所见,NullPointerException是从adapter.notifyDataSetChanged()生成的。谢谢你的合作,伙计。

1 个答案:

答案 0 :(得分:1)

这是因为您的方法llenarListaCasos()onActivityCreated之前调用了。如果这有帮助,请告诉我

    public class FragmentoResultados extends ListFragment {
    Puente activity;
    ArrayList<String> listaCasos;
    ArrayAdapter<String> adapter;

    public interface Puente {
        public void casoAMostrar(String nombreCaso);
    }

    public static FragmentoResultados newInstance() {
        listaCasos = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1,
                listaCasos);
        return new FragmentoResultados();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        //Para verificar si la activity que contiene al fragmento
        //ha implementado la interfaz Puente
        try {
            activity = (Puente) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + "debe implementar la intefaz Puente");
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragmento_resultados,
                container, false);

        setListAdapter(adapter);
        return view;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {//Enviar a la activity el item seleccionado
        activity.casoAMostrar(listaCasos.get(position));
    }

    public void llenarListaCasos(@NotNull ArrayList<String> listaCasos) {
        this.listaCasos = listaCasos;
        if (adapter == null)
            adapter = (ArrayAdapter) getListAdapter();
        adapter.notifyDataSetChanged();
    }
}

// In MainActivity create fragment instance like this
fr = FragmentoResultados.newInstance();