-1

我正在制作一个字典应用程序,我打算在其中包含很多单词。(大约 10 万)我将它与单词的含义一起呈现在一个列表中。

我正在使用自定义数组适配器来填充 listView 并在 listview 中填充自定义布局。

这是我的场景:

1> 我有 edittext 允许用户输入他们正在寻找的单词。2>一旦用户输入单词,例如R,我想设置列表视图的选择,其中第一个字母是 R ,一旦用户输入下一个工作,比如说RE,列表视图位置应更改为列表位置前两个字母是RE

为了实现这一点,我已将 addTextchanged Listner 添加到 edittext 并过滤了适配器,但它不起作用。一旦我输入一些东西,列表就会变空。

您能否建议我更好的方法或如何实现以下功能。

任何帮助将不胜感激。

非常感谢。

4

3 回答 3

1

如果我正确理解您的要求,那么您希望通过基于键入的字母滚动列表来最小化用户必须在您的字典应用程序中进行的键入。
您可以使用自动完成文本视图代替编辑文本来实现相同的结果。
当用户键入一些字母时,android 将显示以这些单词开头的所有单词。
当用户选择正确的单词时,列表可以滚动到该位置。这是示例代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <AutoCompleteTextView
        android:id="@+id/edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:completionThreshold="3" />

</LinearLayout>

公共类 AutoCompleteActivity 扩展 Activity 实现 OnItemClickListener{

private AutoCompleteTextView edit;

private static final String[] items={"lorem", "ipsum", "dolor",
    "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi",
    "vel", "ligula", "vitae", "arcu", "aliquet", "mollis","etiam",
    "vel", "erat", "placerat", "ante", "porttitor", "sodales", 
    "pellentesque", "augue", "purus"};

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    edit=(AutoCompleteTextView)findViewById(R.id.edit);
    edit.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_dropdown_item_1line,
            items));

    edit.setOnItemClickListener(this);
}

@Override
public void onItemClick (AdapterView<?> parent, View v, int position, long Id)
{
    Toast.makeText(AutoCompleteActivity.this, items[position], Toast.LENGTH_SHORT).show();
    // scroll the list to the correct position
    //listView.setSelection(position);
}

}


这里的适配器附加了 autoCompleteText 视图,当用户键入时,它会
在下拉列表中显示以这些字母开头的所有单词,并且当用户
单击列表中的任何单词时,将调用 onItemClick 方法。

我希望这个能帮上忙

于 2012-08-11T14:03:24.657 回答
0

这里有两个建议给你。
1Search Interface搭配使用Content Provider。这种方式有点复杂,但对管理大数据更有效。这Dictionary sample提供了两个搜索选项
- 键入关键字和带有匹配项的建议列表视图下拉菜单。您只需单击并获取单词的含义
- 键入完整的关键字并按放大镜图标,它会返回相对匹配项列表视图。

您可以下载示例并导入或只是Create a sample projectEclipse选择SearchableDictionary示例。

2、贴EdittextListView。添加您的代码,以便我们为您提供帮助。

在我看来AutoCompleteTextViewListView下面是不方便的User。您曾建议下拉列表视图(在 中AutoCompleteTextView),用户希望在单击建议时获得单词的含义,而不是在下面的 ListView 中再次单击(两次单击以获取单词的含义)。一个AutoCompleteTextView带有TextView显示词意义的词似乎很合适。

于 2012-08-11T14:53:01.133 回答
0
public class SearchableDictionary extends Activity {

    private TextView mTextView;
    private ListView mListView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mTextView = (TextView) findViewById(R.id.text);
    mListView = (ListView) findViewById(R.id.list);

    Intent intent = getIntent();

    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        // handles a click on a search suggestion; launches activity to show word
        Intent wordIntent = new Intent(this, WordActivity.class);
        wordIntent.setData(intent.getData());
        startActivity(wordIntent);
        finish();
    } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        // handles a search query
        String query = intent.getStringExtra(SearchManager.QUERY);
        showResults(query);
    }
}

/**
 * Searches the dictionary and displays results for the given query.
 * @param query The search query
 */
private void showResults(String query) {

    Cursor cursor = managedQuery(DictionaryProvider.CONTENT_URI, null, null,
                            new String[] {query}, null);

    if (cursor == null) {
        // There are no results
        mTextView.setText(getString(R.string.no_results, new Object[] {query}));
    } else {
        // Display the number of results
        int count = cursor.getCount();
        String countString = getResources().getQuantityString(R.plurals.search_results,
                                count, new Object[] {count, query});
        mTextView.setText(countString);

        // Specify the columns we want to display in the result
        String[] from = new String[] { DictionaryDatabase.KEY_WORD,
                                       DictionaryDatabase.KEY_DEFINITION };

        // Specify the corresponding layout elements where we want the columns to go
        int[] to = new int[] { R.id.word,
                               R.id.definition };

        // Create a simple cursor adapter for the definitions and apply them to the ListView
        SimpleCursorAdapter words = new SimpleCursorAdapter(this,
                                      R.layout.result, cursor, from, to);
        mListView.setAdapter(words);

        // Define the on-click listener for the list items
        mListView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // Build the Intent used to open WordActivity with a specific word Uri
                Intent wordIntent = new Intent(getApplicationContext(), WordActivity.class);
                Uri data = Uri.withAppendedPath(DictionaryProvider.CONTENT_URI,
                                                String.valueOf(id));
                wordIntent.setData(data);
                startActivity(wordIntent);
            }
        });
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

}

于 2016-11-18T07:05:46.643 回答