package net.oschina.app.ui; import java.util.ArrayList; import java.util.List; import net.oschina.app.AppContext; import net.oschina.app.AppException; import net.oschina.app.R; import net.oschina.app.adapter.ListViewSearchAdapter; import net.oschina.app.bean.SearchList; import net.oschina.app.bean.Notice; import net.oschina.app.bean.SearchList.Result; import net.oschina.app.common.StringUtils; import net.oschina.app.common.UIHelper; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; /** * 搜索 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class Search extends BaseActivity{ private Button mSearchBtn; private EditText mSearchEditer; private ProgressBar mProgressbar; private Button search_catalog_software; private Button search_catalog_post; private Button search_catalog_code; private Button search_catalog_blog; private Button search_catalog_news; private ListView mlvSearch; private ListViewSearchAdapter lvSearchAdapter; private List<Result> lvSearchData = new ArrayList<Result>(); private View lvSearch_footer; private TextView lvSearch_foot_more; private ProgressBar lvSearch_foot_progress; private Handler mSearchHandler; private int lvSumData; private String curSearchCatalog = SearchList.CATALOG_SOFTWARE; private int curLvDataState; private String curSearchContent = ""; private InputMethodManager imm; private final static int DATA_LOAD_ING = 0x001; private final static int DATA_LOAD_COMPLETE = 0x002; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); this.initView(); this.initData(); } /** * 头部按钮展示 * @param type */ private void headButtonSwitch(int type) { switch (type) { case DATA_LOAD_ING: mSearchBtn.setClickable(false); mProgressbar.setVisibility(View.VISIBLE); break; case DATA_LOAD_COMPLETE: mSearchBtn.setClickable(true); mProgressbar.setVisibility(View.GONE); break; } } //初始化视图控件 private void initView() { imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); mSearchBtn = (Button)findViewById(R.id.search_btn); mSearchEditer = (EditText)findViewById(R.id.search_editer); mProgressbar = (ProgressBar)findViewById(R.id.search_progress); mSearchBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { mSearchEditer.clearFocus(); curSearchContent = mSearchEditer.getText().toString(); loadLvSearchData(curSearchCatalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_INIT); } }); mSearchEditer.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ imm.showSoftInput(v, 0); } else{ imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } }); mSearchEditer.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) { if(v.getTag() == null) { v.setTag(1); mSearchEditer.clearFocus(); curSearchContent = mSearchEditer.getText().toString(); loadLvSearchData(curSearchCatalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_INIT); }else{ v.setTag(null); } return true; } return false; } }); search_catalog_software = (Button)findViewById(R.id.search_catalog_software); search_catalog_post = (Button)findViewById(R.id.search_catalog_post); search_catalog_code = (Button)findViewById(R.id.search_catalog_code); search_catalog_blog = (Button)findViewById(R.id.search_catalog_blog); search_catalog_news = (Button)findViewById(R.id.search_catalog_news); search_catalog_software.setOnClickListener(this.searchBtnClick(search_catalog_software,SearchList.CATALOG_SOFTWARE)); search_catalog_post.setOnClickListener(this.searchBtnClick(search_catalog_post,SearchList.CATALOG_POST)); search_catalog_code.setOnClickListener(this.searchBtnClick(search_catalog_code,SearchList.CATALOG_CODE)); search_catalog_blog.setOnClickListener(this.searchBtnClick(search_catalog_blog,SearchList.CATALOG_BLOG)); search_catalog_news.setOnClickListener(this.searchBtnClick(search_catalog_news,SearchList.CATALOG_NEWS)); search_catalog_software.setEnabled(false); lvSearch_footer = getLayoutInflater().inflate(R.layout.listview_footer, null); lvSearch_foot_more = (TextView)lvSearch_footer.findViewById(R.id.listview_foot_more); lvSearch_foot_progress = (ProgressBar)lvSearch_footer.findViewById(R.id.listview_foot_progress); lvSearchAdapter = new ListViewSearchAdapter(this, lvSearchData, R.layout.search_listitem); mlvSearch = (ListView)findViewById(R.id.search_listview); mlvSearch.setVisibility(ListView.GONE); mlvSearch.addFooterView(lvSearch_footer);//添加底部视图 必须在setAdapter前 mlvSearch.setAdapter(lvSearchAdapter); mlvSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //点击底部栏无效 if(view == lvSearch_footer) return; Result res = null; //判断是否是TextView if(view instanceof TextView){ res = (Result)view.getTag(); }else{ TextView title = (TextView)view.findViewById(R.id.search_listitem_title); res = (Result)title.getTag(); } if(res == null) return; //跳转 UIHelper.showUrlRedirect(view.getContext(), res.getUrl()); } }); mlvSearch.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { //数据为空--不用继续下面代码了 if(lvSearchData.size() == 0) return; //判断是否滚动到底部 boolean scrollEnd = false; try { if(view.getPositionForView(lvSearch_footer) == view.getLastVisiblePosition()) scrollEnd = true; } catch (Exception e) { scrollEnd = false; } if(scrollEnd && curLvDataState==UIHelper.LISTVIEW_DATA_MORE) { mlvSearch.setTag(UIHelper.LISTVIEW_DATA_LOADING); lvSearch_foot_more.setText(R.string.load_ing); lvSearch_foot_progress.setVisibility(View.VISIBLE); //当前pageIndex int pageIndex = lvSumData/20; loadLvSearchData(curSearchCatalog, pageIndex, mSearchHandler, UIHelper.LISTVIEW_ACTION_SCROLL); } } public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { } }); } //初始化控件数据 private void initData() { mSearchHandler = new Handler() { public void handleMessage(Message msg) { headButtonSwitch(DATA_LOAD_COMPLETE); if(msg.what >= 0){ SearchList list = (SearchList)msg.obj; Notice notice = list.getNotice(); //处理listview数据 switch (msg.arg1) { case UIHelper.LISTVIEW_ACTION_INIT: case UIHelper.LISTVIEW_ACTION_REFRESH: case UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG: lvSumData = msg.what; lvSearchData.clear();//先清除原有数据 lvSearchData.addAll(list.getResultlist()); break; case UIHelper.LISTVIEW_ACTION_SCROLL: lvSumData += msg.what; if(lvSearchData.size() > 0){ for(Result res1 : list.getResultlist()){ boolean b = false; for(Result res2 : lvSearchData){ if(res1.getObjid() == res2.getObjid()){ b = true; break; } } if(!b) lvSearchData.add(res1); } }else{ lvSearchData.addAll(list.getResultlist()); } break; } if(msg.what < 20){ curLvDataState = UIHelper.LISTVIEW_DATA_FULL; lvSearchAdapter.notifyDataSetChanged(); lvSearch_foot_more.setText(R.string.load_full); }else if(msg.what == 20){ curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvSearchAdapter.notifyDataSetChanged(); lvSearch_foot_more.setText(R.string.load_more); } //发送通知广播 if(notice != null){ UIHelper.sendBroadCast(Search.this, notice); } } else if(msg.what == -1){ //有异常--显示加载出错 & 弹出错误消息 curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvSearch_foot_more.setText(R.string.load_error); ((AppException)msg.obj).makeToast(Search.this); } if(lvSearchData.size()==0){ curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY; lvSearch_foot_more.setText(R.string.load_empty); } lvSearch_foot_progress.setVisibility(View.GONE); if(msg.arg1 != UIHelper.LISTVIEW_ACTION_SCROLL){ mlvSearch.setSelection(0);//返回头部 } } }; } /** * 线程加载收藏数据 * @param type 0:全部收藏 1:软件 2:话题 3:博客 4:新闻 5:代码 * @param pageIndex 当前页数 * @param handler 处理器 * @param action 动作标识 */ private void loadLvSearchData(final String catalog,final int pageIndex,final Handler handler,final int action){ if(StringUtils.isEmpty(curSearchContent)){ UIHelper.ToastMessage(Search.this, "请输入搜索内容"); return; } headButtonSwitch(DATA_LOAD_ING); mlvSearch.setVisibility(ListView.VISIBLE); new Thread(){ public void run() { Message msg = new Message(); try { SearchList searchList = ((AppContext)getApplication()).getSearchList(catalog, curSearchContent, pageIndex, 20); msg.what = searchList.getPageSize(); msg.obj = searchList; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } msg.arg1 = action;//告知handler当前action if(curSearchCatalog.equals(catalog)) handler.sendMessage(msg); } }.start(); } private View.OnClickListener searchBtnClick(final Button btn,final String catalog){ return new View.OnClickListener() { public void onClick(View v) { if(btn == search_catalog_blog) search_catalog_blog.setEnabled(false); else search_catalog_blog.setEnabled(true); if(btn == search_catalog_code) search_catalog_code.setEnabled(false); else search_catalog_code.setEnabled(true); if(btn == search_catalog_news) search_catalog_news.setEnabled(false); else search_catalog_news.setEnabled(true); if(btn == search_catalog_post) search_catalog_post.setEnabled(false); else search_catalog_post.setEnabled(true); if(btn == search_catalog_software) search_catalog_software.setEnabled(false); else search_catalog_software.setEnabled(true); //开始搜索 mSearchEditer.clearFocus(); curSearchContent = mSearchEditer.getText().toString(); curSearchCatalog = catalog; loadLvSearchData(catalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG); } }; } }