搜索关键字高亮和自定义Dialog及DialogFragment的使用

先看显示效果图

搜索前的图片 这里写图片描述

布局:

  • 主界面布局:
<LinearLayout 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"
              android:layout_marginTop="20dp"
              android:layout_marginLeft="20dp"
              android:layout_marginRight="20dp"
              android:orientation="vertical"
              tools:context=".MainActivity">
    <EditText
        android:background="@drawable/seach"
        android:id="@+id/ed_search"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:paddingLeft="40dp"
        android:hint="搜索"
        android:textColor="#00aeee"/>
    <ListView
        android:dividerHeight="1dp"
        android:divider="#22000000"
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>
  • listview的item布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv"
        android:gravity="center"
        android:text="合适"
        android:textSize="24sp"
        android:layout_width="match_parent"
        android:layout_height="60dp"/>
</LinearLayout>

逻辑代码实现

public class MainActivity extends AppCompatActivity {
    private ListView mListView;
    private EditText mEditText;
    private List<String> mList;//源数据集合
    private List<String> mQueryList;//查询数据集合

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

    private void initView() {

        mListView = (ListView) findViewById(R.id.list_view);
        mEditText = (EditText) findViewById(R.id.ed_search);
        mList = new ArrayList<>();
        mQueryList = new ArrayList<>();
    }

    private void initData() {
        mList.add("设置");
        mList.add("缓解");
        mList.add("设计数据");
        mList.add("和平共处");
        mList.add("美好家园");

        mList.add("设置桌面");
        mList.add("缓解");
        mList.add("设计数据");
        mList.add("和平共处世界");
        mList.add("美好过度");

        mList.add("设置数据");
        mList.add("缓解压力");
        mList.add("设计数据");
        mList.add("和平共处");
        mList.add("美好家园");

        mList.add("设置随意");
        mList.add("缓解痛苦");
        mList.add("设计数据");
        mList.add("反射共享");
        mList.add("美好国度");


    }

    private void initEvent() {
        mEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {
                String result = s.toString();
                mQueryList.clear();
                if (TextUtils.isEmpty(result)) {
                    mListView.setAdapter(new SearchAdapter(null, mList, false));
                } else {
                    for (String str : mList) {
                        if (str.contains(result)) {
                            Log.d("tag", "添加了" + str);
                            mQueryList.add(str);
                        }
                    }
                    if (mQueryList.size() == 0) {
                        Toast.makeText(MainActivity.this, "没找到相关信息", Toast.LENGTH_SHORT).show();
                    }

                    mListView.setAdapter(new SearchAdapter(result, mQueryList, true));

                }
            }
        });
        mListView.setAdapter(new SearchAdapter(null, mList, false));
    }


    private class SearchAdapter extends BaseAdapter {
        private String message;
        private List<String> list;
        private boolean isSpan;

        public SearchAdapter(String message, List<String> list, boolean isSpan) {
            this.message = message;
            this.list = list;
            this.isSpan = isSpan;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(MainActivity.this, R.layout.item_list, null);
                holder = new ViewHolder();
                holder.tv = (TextView) convertView.findViewById(R.id.tv);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            String content = list.get(position);
            if (isSpan) {
                SpannableString spstr = matcherSearchTitle(getResources().getColor(R.color.key_blue), content, message);
                holder.tv.setText(spstr);
            } else {
                holder.tv.setText(content);
            }
            return convertView;
        }
    }

    static class ViewHolder {
        TextView tv;
    }

    public SpannableString matcherSearchTitle(int color, String text,
                                                     String keyword) {
        SpannableString s = new SpannableString(text);
        Pattern p = Pattern.compile(keyword);
        Matcher m = p.matcher(s);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new ForegroundColorSpan(color), start, end,
                    Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        }
        return s;
    }
}

搜索结果用悬浮窗体显示

  • 使用自定义dialog
  • 使用官方推荐的DialogFragment来创建对话框,官方建议不要直接使用Dialog创建对话框
自定义Dialog创建对话框显示:
1. 自定义dialog

public class ResultDialog extends Dialog {
private ListView mListView;
private ListAdapter mAdapter;
private AdapterView.OnItemClickListener mListener;

public ResultDialog(Context context) {
    super(context, R.style.ResultDialogTheme);
}

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

    mListView = (ListView) findViewById(R.id.listview_dialog);
    // 设置adapter
    setAdapter(mAdapter);
    setOnItemClickListener(mListener);

    // 改变样式-->window的样式
    Window window = getWindow();
    WindowManager.LayoutParams params = window.getAttributes();
    params.y=240;
    params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;// 设置弹出位置
    window.setAttributes(params);
}

/**
 * 设置adapter
 *
 * @param adapter
 */
public void setAdapter(ListAdapter adapter) {
    this.mAdapter = adapter;
    if (mListView != null) {
        mListView.setAdapter(adapter);
    }
}

public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
    this.mListener = listener;
    if (mListView != null) {
        mListView.setOnItemClickListener(listener);
    }
}

}

2. 修改EditText监听afterTextChanged()方法:
public void afterTextChanged(Editable s) {
    String result = s.toString();
     ResultDialog dialog = new ResultDialog();
     mQueryList.clear();
     if (TextUtils.isEmpty(result)) {
          mListView.setAdapter(new SearchAdapter(null, mList, false));
      } else {

           for (String str : mList) {
               if (str.contains(result)) {
                   Log.d("tag", "添加了" + str);
                   mQueryList.add(str);
                }
          }

          if (mQueryList.size() == 0) {
             Toast.makeText(MainActivity.this, "没找到相关信息", Toast.LENGTH_SHORT).show();
          }else {
             dialog.setAdapter(new SearchAdapter(result, mQueryList, true));
             dialog.show();
             dialog.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                     Toast.makeText(MainActivity.this, "点击了"+position+",内容是"+mQueryList.get(position), Toast.LENGTH_SHORT).show();
                        }
                        });
                    }
                }
            }
        });
使用DialogFragment来实现对话框:

使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。上面会通过例子展示这些好处~
使用DialogFragment至少需要实现onCreateView或者onCreateDIalog方法。onCreateView即使用定义的xml布局文件展示Dialog。onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。

使用起来也非常方便, 和自定义Dialog类似

当然EditText的修改也和自定义dialog一样;

public class ResultDialogFragment extends DialogFragment {

    private ListView mListView;
    private ListAdapter mAdapter;

    private AdapterView.OnItemClickListener mListener;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        View view = inflater.inflate(R.layout.dialog_result, container, false);
        mListView= (ListView) view.findViewById(R.id.listview_dialog);
        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener(mListener);
        return view;
    }

    public void setAdapter(ListAdapter adapter){
        mAdapter=adapter;
        if (mListView!=null){
            mListView.setAdapter(adapter);
        }
    }

    public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
        this.mListener = listener;
        if (mListView != null) {
            mListView.setOnItemClickListener(listener);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值