您的位置:首页 > 移动开发 > Android开发

搜索关键字高亮和自定义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. 自定义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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 搜索