Android ListView 搜索關鍵字高亮顯示

jopen 10年前發布 | 21K 次閱讀 Android Android開發 移動開發

最近項目中用到 EditText + ListView + TextWatcher 實現關鍵字搜索功能,要求 ListView item 的 name 中如果包含了 關鍵字,則對其進行 高亮。研究了一下實現這個效果,主要是 用到 Html.fromHtml(source); 方法。

 

MainActivity.java

package com.example.highlight;

import java.util.ArrayList;
import java.util.List;

import com.example.android_highlightkeyword.R;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.Html;
import android.text.Spanned;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    private ListView mListView;
    private EditText et_input;
    private String userInput = "";
    private List<Data> dataList = new ArrayList<Data>();
    private char[] chs = { 'A', 'B', 'C', 'D', 'E', 'M', 'L', 'F', 'X', 'W',
            'Z' };
    private HightKeywordsAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById();
        initListViewData();
        setListener();
    }

    private void setListener() {

        et_input.addTextChangedListener(watcher);

        mAdapter = new HightKeywordsAdapter();

        mListView.setAdapter(mAdapter);
    }

    private TextWatcher watcher = new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

            userInput = String.valueOf(s);

            mAdapter.notifyDataSetChanged();

        }

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

        }

        public void afterTextChanged(Editable s) {

        }
    };

    private void initListViewData() {

        for (char ch : chs) {

            for (int i = 0; i < 5; i++) {

                Data data = new Data(String.valueOf(ch) + "中國",
                        String.valueOf(ch) + i, String.valueOf(ch));

                dataList.add(data);
            }
        }

    }

    private void findViewById() {
        et_input = (EditText) findViewById(R.id.et_input);
        mListView = (ListView) findViewById(R.id.mListView);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * Customize Adapter, so that realize highlighted keywords
     */
    private class HightKeywordsAdapter extends BaseAdapter {

        @Override
        public int getCount() {

            return dataList.size();
        }

        @Override
        public Object getItem(int position) {

            return dataList.get(position);
        }

        @Override
        public long getItemId(int position) {

            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view;
            ViewHolder holder;

            if (convertView == null) {

                holder = new ViewHolder();

                view = View.inflate(getApplicationContext(),
                        R.layout.list_item, null);

                holder.tv_name = (TextView) view.findViewById(R.id.tv_name);
                holder.tv_en = (TextView) view.findViewById(R.id.tv_en);
                holder.tv_sen = (TextView) view.findViewById(R.id.tv_sen);

                view.setTag(holder);
            } else {
                view = convertView;
                holder = (ViewHolder) view.getTag();
            }

            Data data = dataList.get(position);

            String name = data.getName();

            if (name != null && name.contains(userInput)) {

                int index = name.indexOf(userInput);

                int len = userInput.length();

                Spanned temp = Html.fromHtml(name.substring(0, index)
                        + "<u><font color=#FF0000>"
                        + name.substring(index, index + len) + "</font></u>"
                        + name.substring(index + len, name.length()));

                holder.tv_name.setText(temp);
            } else {
                holder.tv_name.setText(data.getName());
            }

            holder.tv_en.setText(data.getEn());
            holder.tv_sen.setText(data.getSen());

            return view;
        }
    }

    static class ViewHolder {
        public TextView tv_name;
        public TextView tv_en;
        public TextView tv_sen;

    }

}


布局文件 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:background="@drawable/bg">

    <EditText
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:layout_margin="5dp"
        android:hint=""
        android:singleLine="true"
        android:drawableLeft="@drawable/search_icon"
        android:background="@drawable/search_box"/>

    <ListView 
        android:id="@+id/mListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_below="@id/et_input"
        android:cacheColorHint="@android:color/transparent"/>

</RelativeLayout>


 

Data.java

package com.example.highlight;

public class Data {
    private String name;
    private String en;
    private String sen;

    public Data(String name, String en, String sen) {
        this.name = name;
        this.en = en;
        this.sen = sen;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEn() {
        return en;
    }
    public void setEn(String en) {
        this.en = en;
    }
    public String getSen() {
        return sen;
    }
    public void setSen(String sen) {
        this.sen = sen;
    }

}


 

 

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!