搜索关键字高亮和自定义Dialog及DialogFragment的使用
2016-02-19 14:04
666 查看
先看显示效果图
布局:
主界面布局:<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. 自定义dialogpublic 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); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories