需求背景:在android 开发中,我们经常用EditText通过搜索关键字,来查询listview里面的内容,并且关键字高亮显示。

基础知识点

EditText监听文本变化:addTextChangedListener()

2.adapter收到文本变化之后,刷新listview notifyDataSetChanged()

话不多说,直接上代码:

1.先撸个布局:布局就没啥好说的啦,简单粗暴

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_margin="10dp"

android:orientation="vertical"

tools:context="com.yhx.app.MainActivity">

android:id="@+id/editText"

android:layout_width="match_parent"

android:layout_height="50dp"

/>

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="match_parent">

2.当然写个adapter 适配器,这里demo 我就用Listview了,实际项目中,大佬们还是用Recyclerview 哦,这个没得说。

class ListAdapter extends BaseAdapter {

private String changeStr = "";

//

private List mlistdatas;

private LayoutInflater mInflater;

public ListAdapter(Context mcontext, List mlistdatas) {

this.mlistdatas = mlistdatas;

mInflater = LayoutInflater.from(mcontext);

}

@Override

public int getCount() {

return mlistdatas.size();

}

@Override

public Object getItem(int i) {

return mlistdatas.get(i);

}

@Override

public long getItemId(int i) {

return i;

}

@Override

public View getView(int i, View view, ViewGroup viewGroup) {

view = mInflater.inflate(R.layout.search_layout_item, null);

TextView tv_name = view.findViewById(R.id.text_name);

tv_name.setText(mlistdatas.get(i));

//处理关键字颜色变化

if (null != mlistdatas.get(i) && mlistdatas.get(i).contains(changeStr)) {

int index = mlistdatas.get(i).indexOf(changeStr);

int len = changeStr.length();

Spanned temp = Html.fromHtml(mlistdatas.get(i).substring(0, index)

+ ""

+ mlistdatas.get(i).substring(index, index + len) + ""

+ mlistdatas.get(i).substring(index + len, mlistdatas.get(i).length()));

tv_name.setText(temp);

} else {

tv_name.setText(mlistdatas.get(i));

}

return view;

}

//这个方法很重要,editText监听文本变化需要用到

public void changeText(String textStr) {

this.changeStr = textStr;

//别忘了,notifyDataSetChanged()一定要调用,一定要调用,一定要调用,重要事说三遍

notifyDataSetChanged();

}

}

adapter item 布局文件:search_layout_item.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/text_name"

android:layout_width="match_parent"

android:layout_height="45dp"

android:gravity="center_vertical"

android:padding="8dp"

android:text="简书你好"

android:textColor="#333333"/>

Maintivity使用:

public class MainActivity extends AppCompatActivity {

private ListView mlistview;

private EditText meditText;

private ListAdapter mListAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mlistview = (ListView) findViewById(R.id.listview);

meditText = (EditText) findViewById(R.id.editText);

//

mListAdapter = new ListAdapter(this, initData());

mlistview.setAdapter(mListAdapter);

//meditText监听文本变化

meditText.addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override

public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

//告诉adapter 文本有变化了

mListAdapter.changeText(charSequence.toString());

}

@Override

public void afterTextChanged(Editable editable) {

}

});

}

private List initData() {

List mlistdata = new ArrayList<>();

mlistdata.add("我的第一写作,简书");

mlistdata.add("很多年以后,开始相信,所谓爱情,都是因为寂寞");

mlistdata.add("曾经企盼有地老天荒的爱情,有海枯石烂的情缘");

mlistdata.add("爱情不是游戏,因为我们玩不起");

mlistdata.add("爱情不是游戏,因为我们玩不起");

mlistdata.add("爱,不是一个人的独角戏,而是两个人的对手戏");

mlistdata.add("爱,不是一个人的独角戏,而是两个人的对手戏");

mlistdata.add("每个人心里,都有个过不去的人");

mlistdata.add("每个人心里,都有个过不去的人");

mlistdata.add("异地恋,恋的不仅仅是爱情,还有一种坚持");

mlistdata.add("异地恋,恋的不仅仅是爱情,还有一种坚持");

mlistdata.add("曾经,一遍遍的思念,一遍遍的在心里抱怨");

mlistdata.add("爱与被爱同样是受伤害,谁先不爱谁先离开");

mlistdata.add("还有de小星");

return mlistdata;

}

}

少不了老铁们需要的效果图,一切源于效果图说话

fe494f8c5083?appinstall=0

yhx.gif

后记:没有啥技术含量,但简单粗暴,实用,不就是这样吗 哈哈哈哈。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐