当我在List<>中搜索时,如何从recyclerview隐藏项目

时间:2016-09-12 15:47:38

标签: android android-recyclerview searchview android-search

我正在使用recyclerView来显示电影海报的网格。海报包含在List<>中。以及他们各自的头衔等等。

我实现了一个searchView小部件,我可以成功获得匹配结果列表。但我无法隐藏其他人。

根据您的理解,我不想从适配器中删除不相关的电影,否则用户将无法再次看到它们。

这是代码:

public class SearchUtils {

    public static List<String> search(List<Show> list, String keyword){
        List<String> results = new ArrayList<>();

        for (Show curVal : list){
            String curTitle = curVal.getTitle().toLowerCase().trim();
            if (curTitle.contains(keyword)){
                results.add(curTitle);
            }else{
                results = new ArrayList<>();
            }
        }
        return results;

    }
}

ListFragment.java

public class ListFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<Show>> {
    private static final String LOG_TAG = "ListFragment";
    private static final String ARG_SCOPE = "com.dcs.shows.activity_to_launch";
    private static final String BASE_URL = "http://api.themoviedb.org/3";
    private TextView tv;
    private ProgressBar pb;
    private int scope;
    private RecyclerView mRecyclerView;
    private ShowAdapter mShowAdapter;
    private SearchView mSearchView;


    public static ListFragment newInstance(int target) {
        Bundle args = new Bundle();
        args.putInt(ARG_SCOPE, target);
        ListFragment fragment = new ListFragment();
        fragment.setArguments(args);
        return fragment;
    }

    public ListFragment() {
    }



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        scope = getArguments().getInt(ARG_SCOPE);
        setHasOptionsMenu(true);
        Log.i(LOG_TAG, "onCreate@Scope is: " + scope);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_list, container, false);

        mShowAdapter = new ShowAdapter(new ArrayList<Show>());
        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        GridLayoutManager glm = new GridLayoutManager(getActivity(), 4);
        mRecyclerView.setLayoutManager(glm);
        mRecyclerView.addItemDecoration(new SpacesItemDecoration(8, getActivity()));
        mRecyclerView.setAdapter(mShowAdapter);
        mRecyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(glm) {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                // Triggered only when new data needs to be appended to the list
                // Add whatever code is needed to append new items to the bottom of the list
            }
        });

        pb = (ProgressBar)rootView.findViewById(R.id.progress_view);

        ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            // fetch data
            getLoaderManager().initLoader(1, null, this);
        } else {
            // display error
            pb.setVisibility(View.GONE);

        }

        return rootView;
    }



    List<Show> searchList;

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);


        getActivity().getMenuInflater().inflate(R.menu.main, menu);
        final MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
        mSearchView = (SearchView) myActionMenuItem.getActionView();
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                if(!mSearchView.isIconified()) {
                    mSearchView.setIconified(true);
                }
                myActionMenuItem.collapseActionView();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String s) {
                if(s != null || !s.isEmpty()) {
                    for(Show movie : mShowAdapter.getList()) {
                        if(movie.getTitle().toLowerCase().contains(s.toLowerCase())){
                            mShowAdapter.add(movie);
                        }
                        mShowAdapter.notifyDataSetChanged();
                    }
                } else {
                    mShowAdapter.addItemsToList(searchList, false);
                }
                return false;
            }

        });
        mSearchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {

            @Override
            public void onViewDetachedFromWindow(View arg0) {
                // search was detached/closed
                Log.v(LOG_TAG, "Restoring list: " + searchList + " size: " + searchList.size());
                mShowAdapter.addItemsToList(searchList, false);
            }

            @Override
            public void onViewAttachedToWindow(View arg0) {
                // search was opened
                searchList = mShowAdapter.getList();
            }
        });
    }







    private class ShowHolder extends RecyclerView.ViewHolder {
        public ImageView mImageView;
        public TextView mTextView;

        public ShowHolder(View itemView) {
            super(itemView);
            mImageView = (ImageView) itemView.findViewById(R.id.grid_item_image);
            mTextView = (TextView) itemView.findViewById(R.id.grid_item_title);
        }

    }

    private class ShowAdapter extends RecyclerView.Adapter<ShowHolder> {
        private List<Show> mShows;

        public ShowAdapter(List<Show> shows) {
            mShows = shows;
        }
        public void add(Show show){
            mShows.add(show);
            notifyDataSetChanged();
        }
        public void addItemsToList(List<Show> newShows, boolean append){
            if(append){
                mShows.addAll(newShows);
            }else {
                mShows = newShows;
            }
            notifyDataSetChanged();
        }

        public void removeItemsFromList(int index){
            mShows.remove(index);
            notifyItemRemoved(index);
        }


        public List<Show> getList(){
            return mShows;
        }

        @Override
        public ShowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(getActivity());
            View rootView = inflater.inflate(R.layout.list_item_row, parent, false);
            return new ShowHolder(rootView);
        }
        @Override
        public void onBindViewHolder(ShowHolder holder, int position) {
            Show currentShow = mShows.get(position);

            holder.mTextView.setText(currentShow.getTitle());
            Glide.with(getActivity()).load(currentShow.getImage()).into(holder.mImageView);

        }
        @Override
        public int getItemCount() {
            return mShows.size();
        }
    }



    @Override
    public Loader<List<Show>> onCreateLoader(int i, Bundle bundle) {
        //start the loader with the appropriate uri
        //for now it only supports movies+popular
        //it will support movies+top, tv+popular, tv+top.
        Uri baseUri = Uri.parse(BASE_URL);
        Uri.Builder uriBuilder = baseUri.buildUpon();
        uriBuilder.appendPath("movie");
        uriBuilder.appendPath("popular");
        uriBuilder.appendQueryParameter("api_key", QueryUtils.API_KEY);
        uriBuilder.appendQueryParameter("page", Integer.valueOf(1).toString());

        Log.v(LOG_TAG, "onCreateLoader@URL built: " + uriBuilder.toString());

        return new ShowLoader(getActivity(), uriBuilder.toString());
    }


    @Override
    public void onLoadFinished(Loader<List<Show>> loader, List<Show> shows) {
        // Clear the adapter of previous earthquake data
        clearAdapter();

        // If there is a valid list of Shows, then add them to the adapter's
        // data set. This will trigger the ListView to update.
        if (shows != null && !shows.isEmpty()) {
            mShowAdapter.addItemsToList(shows, false);
            mShowAdapter.notifyDataSetChanged();
        }

        pb.setVisibility(View.GONE);
    }

    @Override
    public void onLoaderReset(Loader<List<Show>> loader) {
        // Loader reset, so we can clear out our existing data.
        clearAdapter();
    }


    private void clearAdapter(){
        List<Show> empty = new ArrayList<>();
        mShowAdapter.addItemsToList(empty, false);
        mShowAdapter.notifyDataSetChanged();
    }

由于

1 个答案:

答案 0 :(得分:0)

您可以使用两个列表,一个包含所有元素(原始),另一个包含刚查询过的元素(此一个应使用recyclerview适配器)。查询时,只需从原始列表中选择并将其添加到适配器列表,然后通知更改。在添加新条目之前,不要忘记清除适配器列表。

编辑:你可以在onQueryTextChange方法上尝试这样的事情。适应您自己的愿望。

if(s != null && !s.isEmpty()) {
   for(String movie : originalList) {
      if(movie.toLowerCase().contains(s.toLowerCase()){
         adapter.add(movie);
      }
      notifyChanges();
    }
  }           
} else { adapter.addAll(originalList); }