Android编程权威指南(第27章 搜索)

一、搜索Flick网站

1.添加URL常量(FlickrFetchr.java)

    private static final String FETCH_RECENTS_METHOD = "flickr.photos.getRecent";
    private static final String SEARCH_METHOD = "flickr.photos.search";
    private static final Uri ENDPOINT = Uri
            .parse("https://api.flickr.com/services/rest/")
            .buildUpon()
            .appendQueryParameter("api_key", API_KEY)
            .appendQueryParameter("format", "json")
            .appendQueryParameter("nojsoncallback", "1")
            .appendQueryParameter("extras", "url_s")
            .build();

在这里插入图片描述
2.重构Flickr代码(FlickrFetchr.java)

    private List<GalleryItem> downloadGalleryItems(String url) {

在这里插入图片描述
3.添加创建URL的辅助方法(FlickrFetchr.java)

 private String buildUrl(String method, String query) {
        Uri.Builder uriBuilder = ENDPOINT.buildUpon()
                .appendQueryParameter("method", method);

        if (method.equals(SEARCH_METHOD)) {
            uriBuilder.appendQueryParameter("text", query);
        }

        return uriBuilder.build().toString();
    }

在这里插入图片描述
4.添加方法用于下载和搜索(FlickrFetchr.java)

    public List<GalleryItem> fetchRecentPhotos() {
        String url = buildUrl(FETCH_RECENTS_METHOD, null);
        return downloadGalleryItems(url);
    }

    public List<GalleryItem> searchPhotos(String query) {
        String url = buildUrl(SEARCH_METHOD, query);
        return downloadGalleryItems(url);
    }

在这里插入图片描述
5.硬编码的搜索字符串(PhotoGalleryFragment.java)

            String query = "robot";//Just for testing
            if (Query == null) {
                return new FlickrFetchr().fetchRecentPhotos();
            } else {
                return new FlickrFetchr().searchPhotos(Query);
            }
        }

在这里插入图片描述

二、使用SearchView

1.添加菜单XML文件(res/menu/fragment_photo_gallery.xml)

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_item_search"
          android:title="@string/search"
          app:actionViewClass="android.support.v7.widget.SearchView"
          app:showAsAction="ifRoom" />

    <item android:id="@+id/menu_item_clear"
          android:title="@string/clear_search"
          app:showAsAction="never" />
</menu>

在这里插入图片描述
2.添加搜索字符串(res/values/strings.xml)

    <string name="search">Search</string>
    <string name="clear_search">Clear Search</string>

在这里插入图片描述
3.覆盖onCreateOptionsMenu方法(PhotoGalleryFragment.java)

   setHasOptionsMenu(true);

   @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
        super.onCreateOptionsMenu(menu, menuInflater);
        menuInflater.inflate(R.menu.fragment_photo_gallery, menu);

在这里插入图片描述
在这里插入图片描述
4.日志记录SearchView.OnQueryTextListener事件(PhotoGalleryFragment.java)

 MenuItem searchItem = menu.findItem(R.id.menu_item_search);
        final SearchView searchView = (SearchView) searchItem.getActionView();

            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    Log.d(TAG, "QueryTextSubmit: " + s);
                    QueryPreferences.setStoredQuery(getActivity(), s);
                    updateItems();
                    return true;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    Log.d(TAG, "QueryTextChange: " + s);
                    return false;
                }
            });
         }
             private void updateItems() {
        new FetchItemsTask().execute();
        }

在这里插入图片描述
在这里插入图片描述
5.使用updateItems封装方法(PhotoGalleryFragment.java)

 updateItems();

在这里插入图片描述

三、使用shared preferences实现轻量级数据存储

1.管理保存的查询字符串(QueryPreferences.java)

public class QueryPreferences {

    private static final String PREF_SEARCH_QUERY = "searchQuery";

    public static String getStoredQuery(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context)
                .getString(PREF_SEARCH_QUERY, null);
    }

    public static void setStoredQuery(Context context, String query) {
        PreferenceManager.getDefaultSharedPreferences(context)
                .edit()
                .putString(PREF_SEARCH_QUERY, query)
                .apply();
    }
}

在这里插入图片描述
2.存储用户提交的查询信息(PhotoGalleryFragment.java)

 QueryPreferences.setStoredQuery(getActivity(), s);

在这里插入图片描述
3.清除查询信息(PhotoGalleryFragment.java)

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item_clear:
                QueryPreferences.setStoredQuery(getActivity(), null);
                updateItems();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

在这里插入图片描述
4.在FetchItemsTask中使用保存的查询信息(PhotoGalleryFragment.java)

  String query = QueryPreferences.getStoredQuery(getActivity());
 private String mQuery;
  mQuery = query;
           if (mQuery == null) {
                return new FlickrFetchr().fetchRecentPhotos();
            } else {
                return new FlickrFetchr().searchPhotos(mQuery);
            }

在这里插入图片描述
在这里插入图片描述

四、优化应用

1.默认显示已保存查询信息(PhotoGalleryFragment.java)

 searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String query = QueryPreferences.getStoredQuery(getActivity());
                searchView.setQuery(query, false);
            }
        });

在这里插入图片描述

五、测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值