android - 过滤 ListView 在 TextChanged 上获取 Null

标签 android listview android-listview android-edittext

我有一个填充列表的 XML 解析器。效果很好。我试图通过 EditText 添加过滤器到我的应用程序,但我在 onTextChange 中收到 NullPointerException

public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub
        adapter.getFilter().filter(s);
    }

我的整个类(class)看起来像这样:

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

为什么我的 onTextChanged 上收到 NPE?有什么想法或想法吗?我这样做完全错误吗?


编辑:

这最终成功了:创建一个返回数组信息的方法,然后在 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;
    }

最佳答案

setListAdapter(new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, fv));

将其设置到OnCreate方法中..

关于android - 过滤 ListView 在 TextChanged 上获取 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887990/

相关文章:

C# listview 可点击的列和行

android - 我可以在 SimpleAdapter 上添加 header 吗?

android - UIL,Picasso - 适配器中的图像总是在停止滚动时重新加载

java - Android:针对不同自定义对象的自定义 ArrayAdapter

android - 通过android :fontFamily to custom view in Android

Android iosched 项目错误

Android API-获取浏览器书签/历史记录

java - 安卓应用程序 : How to prevent duplicate email and phone number when people register

android - ListView项目设置错误Android

Android使用上下文操作栏删除选定的项目