【问题标题】:How to update listview using cursor while user enters text如何在用户输入文本时使用光标更新列表视图
【发布时间】:2011-06-28 21:09:43
【问题描述】:

我完全被难住了!我一直在寻找年龄,但找不到解决方案。不过我感觉这会很容易!

Anway,我有一个绑定到光标的列表视图,每次用户输入一个字母时,我希望列表视图搜索数据库并返回结果。这听起来很容易,但我无法弄清楚。提前感谢您的帮助。

这是我目前的代码:

public class MyList extends ListActivity {


    public static final String KEY_ROWID = "headwords._id";
    public static final String KEY_WORDS = "headwords.words";
    private ListAdapter adapter;
    private DbManager myDb;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.item_list);


        myDb = new DbManager(this);
        myDb.open();
        Cursor mCursor = myDb.startsWith("a");
        startManagingCursor(mCursor);



        try {
        adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, mCursor, 
                new String[] { KEY_WORDS, KEY_ROWID },
                new int[] { android.R.id.text1, android.R.id.text2 });
                setListAdapter(adapter);

        } catch (Exception e) {
            Log.i("adapter error Here!", ">>>>>>>>>>> Error!" + e.toString());
        }








        EditText myET = (EditText) findViewById(R.id.search_text);
        myET.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //code which would change listview to only show item that match what is being typed in
            }

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {    
            }

        });

    }

【问题讨论】:

  • 使您的 mCursor 最终化并在 onTextChanged 中调用 mCursor.requery();
  • 重新查询不起作用,因为它与以前的查询不同。

标签: android listview cursor adapter


【解决方案1】:

首先让 mCursor 成为成员:

private Cursor mCursor;

@Override
public void onCreate(Bundle icicle) {
  mCursor = myDb.startsWith("a");
}

然后在我的示例中,我使用 CharSequence 的第一个字母,但这可能不是您想要做的,但关键是 changeCursor();

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
  mCursor = myDb.startsWith(s.toString.substring(0,1));
  adapter.changeCursor(mCursor);
}

【讨论】:

  • 感谢您抽出宝贵时间进行分析并如此迅速!这段代码看起来不错,但是 eclipse 说 ListAdapter 类型的 ChangeCursor 方法是未定义的。任何想法为什么?
  • 您的适配器成员应转换为 SimpleCursorAdapter。所以更改私有 ListAdapter 适配器;到私有 SimpleCursorAdapter 适配器;
  • 呃!我想我该睡觉了。感谢您的帮助,我现在可以完美地工作,即使它有点慢。顺便说一句,Hat rulz 先生!
  • 不要忘记将此标记为答案。它会增加您的声誉!
猜你喜欢
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多