Android 片段中RecylerView上的SearchView

Android 片段中RecylerView上的SearchView,android,android-fragments,android-recyclerview,searchview,Android,Android Fragments,Android Recyclerview,Searchview,我一直在开发一个搜索视图,但失败得很惨。当我在上面键入内容时,不会发生任何事情,也不会过滤列表。我在下面提供了我的片段和适配器。请帮忙!谢谢 附加问题:在searchview中键入内容后,如果我点击后退按钮,我希望键盘隐藏并返回片段的标题。我该怎么做 片段 public class RecentNewsFragment extends Fragment implements ConnectivityReceiver.ConnectivityReceiverListener, SearchView

我一直在开发一个
搜索视图
,但失败得很惨。当我在上面键入内容时,不会发生任何事情,也不会过滤列表。我在下面提供了我的片段和适配器。请帮忙!谢谢

附加问题:在searchview中键入内容后,如果我点击后退按钮,我希望键盘隐藏并返回片段的标题。我该怎么做

片段

public class RecentNewsFragment extends Fragment implements ConnectivityReceiver.ConnectivityReceiverListener, SearchView.OnQueryTextListener {

    public RecentNewsFragment() {

    }

    final String TAG = "MainPageActivity";
    ArrayList<News> newsList;
    public RecyclerView rvNewsArticle;
    public NewsArticleAdapter adapter;
    public SwipeRefreshLayout swipeRefreshLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view =  inflater.inflate(R.layout.fragment_recent_news, container, false);

        checkConnection();

        rvNewsArticle = (RecyclerView) view.findViewById(R.id.rvNewsArticle);
        rvNewsArticle.setHasFixedSize(true);
        final LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        rvNewsArticle.setLayoutManager(manager);

        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.primaryColor, R.color.primaryTextColor, R.color.secondaryColor);
        swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        loadNews();
                    }
                }, 1000);
            }
        });

        return view;
    }

    private void loadNews() {
        String ip = IPAddress.ipaddress;
        String url = "http://" + ip + "/theflare/app/news.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d(TAG, response);

                        newsList = new JsonConverter<News>()
                                .toArrayList(response, News.class);
                        adapter = new NewsArticleAdapter(getActivity(), newsList);
                        rvNewsArticle.setAdapter(adapter);

                        swipeRefreshLayout.setRefreshing(false);

                        FileCacher<ArrayList<News>> newsCacher = new FileCacher<>(getActivity(), "theflarenewscache.txt");
                        try {
                            newsCacher.appendOrWriteCache(newsList);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if (error != null) {
                            Snackbar snackbar = Snackbar
                                    .make(getActivity().findViewById(android.R.id.content), "Something went wrong.", Snackbar.LENGTH_INDEFINITE)
                                    .setAction("Retry", new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            loadNews();
                                        }
                                    });
                            View sbView = snackbar.getView();
                            sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.maroon));
                            snackbar.show();
                        }
                    }
                }
        );

        MySingleton.getInstance(getActivity()).addToRequestQueue(stringRequest);
    }

    private void loadCachedNews() {
        FileCacher<ArrayList<News>> newsCacher = new FileCacher<>(getActivity(), "theflarenewscache.txt");
            if(newsCacher.hasCache()){
                try {
                    ArrayList<News> cachedNewsList = newsCacher.readCache();
                    final NewsArticleAdapter adapter = new NewsArticleAdapter(getActivity(), cachedNewsList);
                    //rvNewsArticle.setAdapter(adapter);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassCastException e){
                    e.printStackTrace();
                }
            }
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.main_page, menu);
        // Associate searchable configuration with the SearchView
        final MenuItem searchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setOnQueryTextListener(this);

        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Do something when collapsed
                        adapter.setFilter(newsList);
                        return true; // Return true to collapse action view
                    }

                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        // Do something when expanded
                        return true; // Return true to expand action view
                    }
                });

        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        if (adapter != null) {

            query = String.valueOf(query.equals(""));
        }
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        newText = newText.toLowerCase();
        final ArrayList<News> filteredNewsList = new ArrayList<>();
        for (News model : newsList) {
            final String title = model.getTitle().toLowerCase();
            final String author = model.getAuthor().toLowerCase();
            final String category = model.getCategory().toLowerCase();
            final String content = model.getContent().toLowerCase();
            if ((title.contains(newText)) || (author.contains(newText)) || (category.contains(newText)) || (content.contains(newText))) {
                filteredNewsList.add(model);
            }
        }
        adapter.setFilter(filteredNewsList);
        return true;
    }

    // Method to manually check connection status
    private void checkConnection() {
        boolean isConnected = isConnected();
        snackInternet(isConnected);
    }

    private void snackInternet(boolean isConnected) {
      if (isConnected) {
          Snackbar snackbar = Snackbar.make(getActivity().findViewById(android.R.id.content), "Connected to the Internet!", Snackbar.LENGTH_SHORT);
          View sbView = snackbar.getView();
          sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.primaryDarkColor));
          snackbar.show();
          loadNews();
      }
      else {
          Snackbar snackbar = Snackbar
                  .make(getActivity().findViewById(android.R.id.content), "You seem to be offline.", Snackbar.LENGTH_INDEFINITE)
                  .setAction("Retry", new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {
                          loadNews();
                      }
                  });
          View sbView = snackbar.getView();
          sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.maroon));
          snackbar.show();
          loadCachedNews();
      }
    }

    @Override
    public void onResume() {
        super.onResume();

        // register connection status listener
        TheFlare.getInstance().setConnectivityListener(this);
    }

    /**
     * Callback will be triggered when there is change in
     * network connection
     */
    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        snackInternet(isConnected);
    }

}
公共类RecentNewsFragment扩展片段实现了ConnectivityReceiver.ConnectivityReceiverListener、SearchView.OnQueryTextListener{
公共最新新闻片段(){
}
最后一个字符串TAG=“MainPageActivity”;
ArrayList新闻列表;
公共再利用新闻文章;
公共新闻文章适配器;
公共SwipeRefreshLayout SwipeRefreshLayout;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u最新消息,容器,false);
检查连接();
rvNewsArticle=(RecyclerView)view.findViewById(R.id.rvNewsArticle);
rvNewsArticle.setHasFixedSize(true);
最终LinearLayoutManager=新的LinearLayoutManager(getActivity());
rvNewsArticle.setLayoutManager(管理器);
swipeRefreshLayout=(swipeRefreshLayout)view.findViewById(R.id.swipeRefresh);
swipeRefreshLayout.setColorSchemeResources(R.color.primaryColor,R.color.primaryTextColor,R.color.secondaryColor);
swipeRefreshLayout.setSize(swipeRefreshLayout.LARGE);
swipeRefreshLayout.setOnRefreshListener(新的swipeRefreshLayout.OnRefreshListener()){
@凌驾
公共void onRefresh(){
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
loadNews();
}
}, 1000);
}
});
返回视图;
}
私有void loadNews(){
字符串ip=IPAddress.IPAddress;
String url=“http://“+ip+”/theflare/app/news.php”;
StringRequest StringRequest=新StringRequest(Request.Method.GET,
网址,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
Log.d(标签、响应);
newsList=newjsonconverter()
.toArrayList(响应、新闻、类);
adapter=新的NewsArticleAdapter(getActivity(),newsList);
rvNewsArticle.setAdapter(适配器);
swipeRefreshLayout.setRefreshing(false);
FileCacher newsCacher=新的FileCacher(getActivity(),“theflarenewscache.txt”);
试一试{
newsCacher.appendOrWriteCache(新闻列表);
}捕获(IOE异常){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
if(错误!=null){
Snackbar Snackbar=Snackbar
.make(getActivity().findViewById(android.R.id.content),“出错了”,Snackbar.LENGTH\u不确定)
.setAction(“重试”,新建视图.OnClickListener(){
@凌驾
公共void onClick(视图){
loadNews();
}
});
View sbView=snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.maroon));
snackbar.show();
}
}
}
);
getInstance(getActivity()).addToRequestQueue(stringRequest);
}
私有void loadCachedNews(){
FileCacher newsCacher=新的FileCacher(getActivity(),“theflarenewscache.txt”);
if(newsCacher.hasCache()){
试一试{
ArrayList cachedNewsList=newsCacher.readCache();
final NewsArticleAdapter=新的NewsArticleAdapter(getActivity(),cachedNewsList);
//rvNewsArticle.setAdapter(适配器);
}捕获(IOE异常){
e、 printStackTrace();
}catch(ClassCastException e){
e、 printStackTrace();
}
}
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
充气机。充气(右菜单。主页面,菜单);
//将可搜索配置与SearchView关联
final MenuItem searchItem=menu.findItem(R.id.action\u search);
最终SearchView SearchView=(SearchView)MenuItemCompat.getActionView(searchItem);
setOnQueryTextListener(这个);
MenuItemCompat.setOnActionExpandListener(searchItem,新MenuItemCompat.OnActionExpandListener()){
@凌驾
公共布尔值onMenuItemActionCollapse(MenuItem项){
//崩溃时做点什么
setFilter(新闻列表);
return true;//将true返回到折叠操作视图
}
@凌驾
公共布尔值onMenuItemActionExpand(MenuItem项){
public class NewsArticleAdapter extends RecyclerView.Adapter<NewsArticleAdapter.NewsViewHolder> {

    private Context context;
    private ArrayList<News> newsList;

    public NewsArticleAdapter(Context context, ArrayList<News> newsList){
        this.context = context;
        this.newsList = newsList;
    }

    @Override
    public NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.from(parent.getContext())
                .inflate(R.layout.news_cardview_layout, parent, false);

        NewsViewHolder newsViewHolder = new NewsViewHolder(view);
        return newsViewHolder;
    }

    @Override
    public void onBindViewHolder(NewsViewHolder holder, int position) {
        final News selectedNews = newsList.get(position);
        holder.tvId.setText(String.valueOf(selectedNews.id));
        holder.tvTitle.setText(selectedNews.title);
        holder.tvPubDate.setText("" + selectedNews.publicationDate);

        String ip = IPAddress.ipaddress;
        String fullUrl = "http://" + ip + "/theflare/admin/img/newsbanner/" + selectedNews.imgBanner;

        Picasso.with(context)
                .load(fullUrl)
                .placeholder(R.drawable.bannerplaceholder)
                .error(android.R.drawable.stat_notify_error)
                .into(holder.ivImage);

        holder.ivImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick (View view) {
                Intent intent = new Intent(context, NewsDetailActivity.class);
                intent.putExtra("newsList", selectedNews);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });

    }

    @Override
    public int getItemCount() {
        if(newsList != null){
            return newsList.size();
        }
        return 0;
    }

    public void setFilter(ArrayList<News> newsArrayList) {
        newsList.clear();
        newsList.addAll(newsArrayList);
        notifyDataSetChanged();
    }

    //ViewHolder class
    public static class NewsViewHolder extends RecyclerView.ViewHolder{

        public CardView cvNews;
        public TextView tvId;
        public ImageView ivImage;
        public TextView tvTitle;
        public TextView tvPubDate;

        public NewsViewHolder(View itemView) {
            super(itemView);
            cvNews = (CardView)itemView.findViewById(R.id.cvNews);
            tvId = (TextView) itemView.findViewById(R.id.tvId);
            ivImage = (ImageView)itemView.findViewById(R.id.ivImageUrl);
            tvTitle = (TextView)itemView.findViewById(R.id.tvTitle);
            tvPubDate = (TextView)itemView.findViewById(R.id.tvPubDate);

        }
    }
}
@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        return true;
    }
setHasOptionsMenu(true);
public class RecentNewsFragment extends Fragment implements SearchView.OnQueryTextListener, MenuItem.OnActionExpandListener
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        final MenuItem searchItem = menu.findItem(R.id.action_search);
        MenuItemCompat.setShowAsAction(searchItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setOnQueryTextListener(this);

        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        if (newText == null || newText.trim().isEmpty()) {
            adapter.setFilter(newsList);
            return false;
        }
        newText = newText.toLowerCase();
        final ArrayList<News> filteredNewsList = new ArrayList<>();
        for (News model : newsList) {
            final String title = model.getTitle().toLowerCase();
            final String author = model.getAuthor().toLowerCase();
            final String category = model.getCategory().toLowerCase();
            final String content = model.getContent().toLowerCase();
            if ((title.contains(newText)) || (author.contains(newText)) || (category.contains(newText)) || (content.contains(newText))) {
                filteredNewsList.add(model);
            }
        }
        adapter.setFilter(filteredNewsList);
        return true;
    }

@Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        adapter.setFilter(newsList);
        return true;
    }
public void setFilter(ArrayList<News> newsArrayList) {
        news.clear();
        news.addAll(newsArrayList);
        notifyDataSetChanged();
    }