Question

I am trying to make a searchable list using a search widget I already have (android:id="@+id/searchView1"), and so far I have only found help for ListViews with ArrayAdapters and the solutions for those have not worked

Here is my code

public class SearchActivity extends Activity {
ListView listView ;
// Array of words: source http://www.knittinghelp.com/videos/knitting-glossary
String[] words = new String[] {
        "( )",
        "[ ]",
        "*",
        "**",
        "alt",
        "approx",
        "beg",
        "bet",
        "BO",
        "CA",
        "CB",
        "CC",
        "cdd",
        "ch",
        "cm",
        "cn",
        "CO",
        "cont"
};

// Array of meanings: source http://www.knittinghelp.com/videos/knitting-glossary
String[] meaning = new String[]{
    "work instruction between parentheses, in the place directed",
    "work instructions between brackets, as many times as directed",
    "repeat instructions following the single asterisk as directed",
    "repeat instructions between asterisks, as directed",
    "alternative",
    "approximately",
    "beginning",
    "between",
    "Bind off",
    "colour A",
    "colour B",
    "colour C",
    "centered double decrease. sl2 tog, K1, pass the slipped stitches over (together)",
    "chain (using crochet hook). Start with a slip knot.",
    "centimeter(s)",
    "cable needle: short knitting needle, used as an aid in the twisting of a cable.",
    "cast on",
    "continue"
};

/**
 * When the search activity begins, show the view as in the search xml, and list the
 * given values in the list view
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    final List<HashMap<String, String>> wordList = new ArrayList<HashMap<String, String>>();        

    for(int i=0; i<words.length; i++){
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("word", words[i]);
        hashMap.put("meaning", meaning[i]);           
        wordList.add(hashMap);        
    }        

    final SimpleAdapter adapter = new SimpleAdapter(this, wordList, 
            android.R.layout.simple_list_item_2, 
            new String[] {"word", "meaning"}, 
            new int[] {android.R.id.text1, android.R.id.text2});

    ListView listView = (ListView) findViewById(R.id.listView1);

    listView.setAdapter(adapter); 

    EditText search = (EditText) findViewById(R.id.searchView1);

    search.addTextChangedListener(new TextWatcher() {

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

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    }); 
}
}

In onTextChanged, I get an error on adapter saying it can't be resolved. It would be awesome if someone could point me in the right direction :)

Was it helpful?

Solution

You need to add an instance variable called adapter in the outer class. Based on the code block you posted you need to have a SimpleAdapter member variable called adapter like so:

public class SearchActivity extends Activity {
   ListView listView;
   SimpleAdapter adapter; // this is what you're missing

because SearchActivity.this.adapter.getFilter().filter(s), is referencing an instance variable called adapter of the SearchActivity class (which currently doesn't exist).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top