package mcxtzhang.searchdemo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.widget.EditText; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView mLv; private JokeFillterAdapter mJokeFillterAdapter; private EditText mEtSearch; private ArrayList<TestBean> mDatas; private static final int MSG_UPDATE_SEARCH_RESULT = 1001; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_UPDATE_SEARCH_RESULT: mJokeFillterAdapter.notifyDataSetChanged(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLv = (ListView) findViewById(R.id.mLv); mLv.setTextFilterEnabled(true); // 开启过滤功能 mEtSearch = (EditText) findViewById(R.id.mEtSearch); mEtSearch.addTextChangedListener(new JokeListener()); initDatas(); mJokeFillterAdapter = new JokeFillterAdapter(this, R.layout.item, mDatas) { @Override public void convert(ViewHolder holder, TestBean testBean) { holder.setText(R.id.tv1, testBean.getName()); holder.setText(R.id.tv2, testBean.getUrl()); } }; mLv.setAdapter(mJokeFillterAdapter); } class JokeListener implements TextWatcher { @Override public void afterTextChanged(Editable s) {//表示最终内容 Log.d("afterTextChanged", s.toString()); } /** * @param s * @param start 开始的位置 * @param count 被改变的旧内容数 * @param after 改变后的内容数量 */ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //这里的s表示改变之前的内容,通常start和count组合,可以在s中读取本次改变字段中被改变的内容。而after表示改变后新的内容的数量。 } /** * @param str * @param start 开始位置 * @param before 改变前的内容数量 * @param count 新增数 */ @Override public void onTextChanged(CharSequence str, int start, int before, int count) { //这里的s表示改变之后的内容,通常start和count组合,可以在s中读取本次改变字段中新的内容。而before表示被改变的内容的数量。 if (TextUtils.isEmpty(str.toString().trim())) { mLv.clearTextFilter();//搜索文本为空时,过滤设置 //mJokeFillterAdapter.getFilter().filter(""); mHandler.sendEmptyMessage(MSG_UPDATE_SEARCH_RESULT); } else { // search_list.clearTextFilter(); mLv.setFilterText(str.toString().trim());//设置过滤关键字 会带上一个局域屏幕中心的搜索文本提示 //mJokeFillterAdapter.getFilter().filter(str.toString().trim()); // 不会带上一个局域屏幕中心的搜索文本提示 mHandler.sendEmptyMessage(MSG_UPDATE_SEARCH_RESULT); } } } public List<TestBean> initDatas() { mDatas = new ArrayList<>(); int i = 0; for (int j = 0; j < 600; j++) { mDatas.add(new TestBean((i++) + " ", "张")); mDatas.add(new TestBean((i++) + " ", "旭童")); mDatas.add(new TestBean((i++) + " ", "多种type")); mDatas.add(new TestBean((i++) + " ", "遍")); mDatas.add(new TestBean((i++) + " ", "多种type")); mDatas.add(new TestBean((i++) + " ", "多种type")); mDatas.add(new TestBean((i++) + " ", "多种type")); mDatas.add(new TestBean((i++) + " ", "多种type")); } return mDatas; } }