TPshop完整APP项目(含服务器源码)第三课 - 商城搜索功能.
看图如下:
功能描述: 点击顶部文本输入框弹出软键盘, 输入关键字后, 点击键盘上的"搜索"键后请求后台搜索API
并将结果展示在列表中.
结构分析: 自上而下, 顶部是一个自定义View的searchView ,接下来是一个后台设置的热词列表, 下面是一个搜索记录的listview
顶部SPSearchView
public class SPSearchView extends LinearLayout {
private ImageView backImgv;
private EditText searchEdtv;
private SPSearchViewListener searchListener;
/**
* @param context
* @param attrs
*/
public SPSearchView(Context context, AttributeSet attrs) {
super(context, attrs);
View view = LayoutInflater.from(context).inflate(R.layout.search_heard_view, this);
searchEdtv = (EditText)view.findViewById(R.id.search_edtv);
backImgv = (ImageView)view.findViewById(R.id.back_imgv);
searchEdtv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (searchListener != null) {
//searchListener.onSearchBoxClick(searchEdtv.getText().toString());
}
}
});
backImgv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (searchListener != null) searchListener.onBackClick();
}
});
searchEdtv.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { //响应键盘"搜索"键
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
notifyStartSearching(textView.getText().toString());
}
return true;
}
});
}
/**
* 通知监听者 进行搜索操作
* @param text
*/
private void notifyStartSearching(String text){
if (searchListener != null) {
searchListener.onSearchBoxClick(text);
}
}
public void setSearchKey(String searchKey){
if (this.searchEdtv!=null && !SPStringUtils.isEmpty(searchKey)){
this.searchEdtv.setText(searchKey);
}
}
public EditText getSearchEditText(){
return this.searchEdtv;
}
public void setSearchViewListener(SPSearchViewListener listener){
this.searchListener = listener;
}
public interface SPSearchViewListener{
public void onBackClick();
public void onSearchBoxClick(String keyword);
}
}
搜索界面Activity的实现:
布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.soubao.tpshop.view.SPSearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="50dip" /> <ListView android:id="@+id/search_key_listv" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/separator_line" android:dividerHeight="1px" android:fadingEdge="none" android:fastScrollEnabled="false" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:layout_marginTop="50dip" android:layout_marginBottom="50dip" android:scrollbars="none" android:smoothScrollbar="true" /> <Button android:id="@+id/search_delete_btn" android:layout_width="match_parent" android:layout_height="@dimen/height_button" android:layout_alignParentBottom="true" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:layout_marginBottom="10dip" style="@style/textStyle.Normal.black" android:text="@string/delete_history" android:background="@drawable/tag_button_bg_unchecked" android:layout_centerHorizontal="true"/> </RelativeLayout>
onCreate中设置自定义标题
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
}
搜索记录缓存到SharedPrefreences中
public void loadKey(){
mSearchkeys = new ArrayList<String>();
String searchKey = SPSaveData.getString(this, SPMobileConstants.KEY_SEARCH_KEY);
if (!SPStringUtils.isEmpty(searchKey)){
String[] keys = searchKey.split(",");
if (keys !=null)
for(int i=0; i< keys.length; i++){
if (!SPStringUtils.isEmpty(keys[i])){
mSearchkeys.add(keys[i]);
}
}
}
}
public void saveKey(String key){
String searchKey = SPSaveData.getString(this, SPMobileConstants.KEY_SEARCH_KEY);
if (!SPStringUtils.isEmpty(searchKey) && !searchKey.contains(key)) {
searchKey+=","+key;
}else{
searchKey = key;
}
SPSaveData.putValue(this, SPMobileConstants.KEY_SEARCH_KEY, searchKey);
}
完整源码下载地址: demo tpshop安卓源码下载