I have an XML parser populating a list. That is working just fine. I am trying to add a filter via EditText
to my app, but I get a NullPointerException
in the onTextChange
.
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
adapter.getFilter().filter(s);
}
My entire class looks like so:
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.androidquery.AQuery;
import com.androidquery.callback.AjaxStatus;
import com.androidquery.util.AQUtility;
import com.androidquery.util.XmlDom;
public class MainActivity extends ListActivity implements TextWatcher {
private AQuery aq;
ProgressDialog dialog;
String etValue;
EditText searchText;
TextView result;
String url = "http://domain.com/it.xml";
ListView lv;
String Name;
String barcode;
String productName;
String qtySold;
String inventory;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressDialog dialog = new ProgressDialog(this);
dialog.setIndeterminate(false);
dialog.setInverseBackgroundForced(false);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("Help on the Way...");
dialog.setMessage("Gathering Latest Inventory Info");
aq = new AQuery(this);
AQUtility.setDebug(true);
// load the file from the server
load_xml();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void load_xml() {
aq.progress(dialog).ajax(url, XmlDom.class, -1, this, "inventoryCb");
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void inventoryCb(String url, XmlDom xml, AjaxStatus status) {
// Log.i("CB", xml.toString());
List<XmlDom> sec = xml.tags("GroupFooter");
List<String> fv = new ArrayList<String>();
for (XmlDom entry : sec) {
List<XmlDom> ent = entry.tags("Field");
for (XmlDom field : ent) {
Name = field.attr("Name");
// Log.v("Field Name: ", Name);
if (Name.equals("Field19")) {
barcode = field.child("FormattedValue").text();
// Log.i("Barcode: ", barcode);
}
if (Name.equals("Field20")) {
productName = field.child("FormattedValue").text();
// Log.d("Product Name: ", productName);
}
if (Name.equals("Field21")) {
qtySold = field.child("FormattedValue").text();
// Log.e("Qty Sold: ", qtySold);
}
}
inventory = barcode + " | " + productName + " | " + qtySold;
fv.add(inventory);
Log.i("INVENTORY: ", inventory);
}
searchText = (EditText) findViewById(R.id.inputSearch);
searchText.addTextChangedListener(this);
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, fv));
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
adapter.getFilter().filter(s);
}
}
Why am I getting an NPE on my onTextChanged
? Any thoughts or ideas? Am I doing this completely wrong?
Edit:
This ended up working: Create a method that returns array info and then call it in the adapter in the onCreate
:
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, xmlr());
setListAdapter(adapter);
EditText filterEditText = (EditText) findViewById(R.id.filterText);
filterEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
// LOAD XML from Local Resources Folder
public List<String> xmlr() {
InputStream is = getResources().openRawResource(R.raw.it);
XmlDom xml = null;
try {
xml = new XmlDom(is);
} catch (SAXException e) {
// TODO Auto-generated catch block
Log.e("SAXe: ", e.getMessage());
}
List<XmlDom> sec = xml.tags("GroupFooter");
fv = new ArrayList<String>();
for (XmlDom entry : sec) {
List<XmlDom> ent = entry.tags("Field");
for (XmlDom field : ent) {
Name = field.attr("Name");
// Log.v("Field Name: ", Name);
if (Name.equals("Field19")) {
barcode = field.child("FormattedValue").text();
// Log.i("Barcode: ", barcode);
}
if (Name.equals("Field20")) {
productName = field.child("FormattedValue").text();
// Log.d("Product Name: ", productName);
}
if (Name.equals("Field21")) {
qtySold = field.child("FormattedValue").text();
// Log.e("Qty Sold: ", qtySold);
}
}
inventory = barcode + " | " + productName + " | " + qtySold;
fv.add(inventory);
Log.i("INVENTORY: ", inventory);
}
return fv;
}