SQLite
,ListFragment
和更多内容开发应用。这是我的代码:
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()
生成的。谢谢你的合作,伙计。
答案 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();