Android:试图在列表中找到一个项目而不过滤列表,但只是滚动到该项目

Android:试图在列表中找到一个项目而不过滤列表,但只是滚动到该项目

问题描述:

试图实现简单的字典。我希望在用户在EditText框中输入列表时自动滚动到最佳匹配。我不希望它过滤列表。例如,如果用户在EditText中键入“s”,我希望他/他在EditText框下看到的第一个单词成为词典中以“s”开头的第一个单词。但是用户仍然应该能够上下滑动并能够看到整个单词列表。它基本上就像去功能。我使用ArrayList来存储我的单词列表。数据位于res/raw/data.xml文件中。这是我的onCreate方法 @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main);Android:试图在列表中找到一个项目而不过滤列表,但只是滚动到该项目

wordListView = (ListView)findViewById(R.id.wordList); 
    myEditText = (EditText)findViewById(R.id.myEditText); 

    words = new ArrayList<Word>(); 

    arrAdap = new ArrayAdapter<Word>(this, android.R.layout.simple_list_item_1, words); 

    wordListView.setAdapter(arrAdap); 


    try { 
    InputStream inSource = getResources().openRawResource(R.raw.data); 
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

    Document doc = builder.parse(inSource, null); 
    NodeList wordsList = doc.getElementsByTagName("eng-bg"); 
    int length = wordsList.getLength(); 
    for(int i = 0; i<length; i++) { 
     Element entry = (Element)wordsList.item(i); 
     Element eng = (Element)entry.getElementsByTagName("english").item(0); 
     Element bul = (Element)entry.getElementsByTagName("bulgarian").item(0); 
     Element id = (Element)entry.getElementsByTagName("ID").item(0); 

     String english = eng.getFirstChild().getNodeValue(); 
     String bulgarian = bul.getFirstChild().getNodeValue(); 
     int wordId = Integer.parseInt(id.getFirstChild().getNodeValue()); 

     Word word = new Word(bulgarian, english, wordId); 
     addNewWord(word); 
    } 
} catch (ParserConfigurationException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (SAXException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

wordListView.setOnItemClickListener(new OnItemClickListener(){ 
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
    selectedWord = words.get(pos); 
    showDialog(TRANS_DIALOG); 
    myEditText.setText(selectedWord.getEnglish()); 
} 
}); 

myEditText.addTextChangedListener(new TextWatcher(){ 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

@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 

} 

    }); 
} 

你textWatcher应拨打afterTextChanged你的ListView的smoothScrollToPosition方法。例如,粗略的想法:

String searchString = s.getText().toString(); //get the EditText's current value 
// naive brute-force search, you can definitely be smarter about this, maybe using Java Collections binary-search to find the right spot 
for (int i=0; i<words.size(); i++) { 
    String word = words.get(i).toString() // assuming your Words can call toString() 
    if (word.startswith(searchString)) { 
     getListView().smoothScrollToPosition(i); 
     break; 
    } 
} 
+0

谢谢,Yoni!这工作,但我没有意识到它会滚动得这么慢。我需要能够直接跳到所需单词的东西。你可以想象如果用户输入以z开头的单词会发生什么。另外,这个smoothScrollToPosition()不会在EditText下显示正确的单词。它实际上显示在屏幕的底部。你有什么其他的建议?再次感谢 – iblagoev 2010-10-17 22:37:56

+0

我明白了。我用setSelection(i); – iblagoev 2010-10-17 23:14:54