最重要是 用TextWatcher 监听字母变化后 动态改变 listview 
自带通讯录源码看不懂,希望哪位大神做过类似例子,麻烦讲解一下,最好附源码!!

解决方案 »

  1.   


    如果想更新 simpleadapter 中的数据源 是不是需要使用 handler呢?
    如何使用呢?
      

  2.   

        不需要的,android下有个控件 叫autocomplete,就有这个效果,不需要你自己来实现这种效果。
      

  3.   


    自动完成文本得不到我想要的效果,我是想动态的改变 listview中的item,就跟系统自带的搜索功能一样。
      

  4.   

    我觉得应该是这样:监听EditText里的OnKeyListener事件,然后在Listener里面的onKey回调方法中根据输入的值刷新ListView,可以使用handler来实现。
      

  5.   


    我用的是
    mEditText.addTextChangedListener  TextWatcher()
    一般用这个 好些
      

  6.   

    addTextChangedListener 这个确实好一些,LZ的意思应该是实现这样的效果吧:
    refresh_list.xml<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <EditText 
        android:id="@+id/txt_input"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        />
        <ListView android:id="@+id/list1"
         android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        /></LinearLayout>package com.joyband.android;import java.util.ArrayList;import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.Toast;/**
     * @author iampy
     * 
     */
    public class RefreshListByEditText extends Activity implements
    OnItemClickListener {
    private static final String TAG = "====RefreshListByEditText_TAG====";
    private EditText input;
    private ListView listView;
    private String[] listValue = { "Java", "JavaSE", "JavaEE", "Oracle 8",
    "Oracle 9i", "Oracle 10g" };
    private ArrayAdapter<String> adapter;
    private Handler handler;
    private static final int MSG_KEY = 0x1234; public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.refresh_list); input = (EditText) findViewById(R.id.txt_input);
    input.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable editer) {
    Log.d(TAG, "afterTextChanged");
    } public void beforeTextChanged(CharSequence value, int arg0,
    int arg1, int arg2) {
    Log.d(TAG, "beforeTextChanged");
    } public void onTextChanged(CharSequence value, int arg0, int arg1,
    int arg2) {
    Log.d(TAG, "onTextChanged");
    Log.w(TAG, "input.text=" + value.toString());
    Message msg = new Message();
    msg.what = MSG_KEY;
    Bundle data = new Bundle();
    data.putString("value", value.toString());
    msg.setData(data);
    handler.sendMessage(msg);
    }
    });
    listView = (ListView) findViewById(R.id.list1);
    adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, listValue);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this); handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case MSG_KEY:
    refreshListView(msg.getData().get("value").toString());
    }
    }
    };
    } private void refreshListView(String value) {
    if (value == null || value.trim().length() == 0){
    adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, listValue);
    listView.setAdapter(adapter);
    }
    ArrayList<String> tmpList = new ArrayList<String>();
    for (String s : listValue) {
    if (s.indexOf(value) >= 0) {
    tmpList.add(s);
    }
    }
    if (tmpList.size() == 0)
    return;
    adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, tmpList);
    listView.setAdapter(adapter);
    listView.invalidateViews();
    } public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    Toast.makeText(this, "选择列表项:" + position, Toast.LENGTH_SHORT).show();
    } @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(Menu.NONE, 1, 0, "刷新");
    menu.add(Menu.NONE, 2, 0, "退出");
    return super.onCreateOptionsMenu(menu);
    } @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case 1:
    input.setText("");
    Message msg = new Message();
    msg.what = MSG_KEY;
    Bundle data = new Bundle();
    data.putString("value", "");
    msg.setData(data);
    handler.sendMessage(msg);
    break;
    case 2:
    finish();
    break;
    default:
    break;
    } return super.onOptionsItemSelected(item);
    }}
      

  7.   

    不客气,其中方法private void refreshListView(String value)中的if (tmpList.size() == 0)
                return;
    这一句有点问题,导致删除输入框的文字后不能刷新,这一句应该去掉,或者重新刷新整个列表。