你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果。请接受挑战,让搜索过程更流畅一些。用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示搜索按钮的初始状态)。再来个挑战。用户一提交搜索,就初始化 RecyclerView ,显示一个搜索结果加载状态界面(使用状态指示器)。下载到JSON数据之后,就删除状态指示器。也就是说,一旦开始下载图片,

就不应显示加载状态了

 

 1.提交搜索,隐藏软键盘,收起SearchView;

将SearchView变为成员变量,增加一个InputMethodManager对象,在onCreate()方法中对其进行实例化。

private InputMethodManager mInputMethodManager;

    private SearchView mSearchView;
mInputMethodManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

 

在PhotoGalleryFragment中增加隐藏软键盘,收起SearchView的方法,代码如下:

 private void hintSoftInputAndSearchField(){
        View v = getActivity().getCurrentFocus();
        if(v == null){
            return;
        }
        mInputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); //折叠软键盘
        mSearchView.onActionViewCollapsed();  //收起SearchView的方法。
    }

然后在SearchView监听器的onQueryTextSubmit()方法中调用即可。

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {//提交搜索查询时。这个方法执行。
                Log.d(TAG, "onQueryTextSubmit: "+ s);
                QueryPreferences.setStoredQuery(getActivity(),s); //存储用户提交的查询信息。
                updateItems();
                hintSoftInputAndSearchField(); //隐藏键盘的方法
                mProgressDialog= getDialog();
                mProgressDialog.show();
                return true;
            }

            ......
         });

 

2.显示一个搜索结果加载状态界面(使用状态指示器),当下载到JSON数据时删除。

1.增加一个ProgressDialog的成员变量。

public   ProgressDialog mProgressDialog;

2.在SearchView监听器的onQueryTextSubmit()方法中让对话框显示出来。(进行搜索时候显示)

mProgressDialog=  new ProgressDialog(getActivity());
                mProgressDialog.setMessage("loading...");
                mProgressDialog.setCancelable(true);
                mProgressDialog.show();

3.在FetchItemsTask类中的onPostExecute()方法中将对话框移除(获取到数据后关闭)

@Override
        protected void onPostExecute(List<GalleryItem> items){
            mItems = items;
            if(mItems.size() > 0){  //如果有数据则关闭
                mProgressDialog.dismiss(); 
            }
            setupAdapter();

        }