- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究 SearchView
,但我惨遭失败。当我在上面输入内容时,没有任何反应,也不会过滤列表。我在下面提供了我的 fragment 和我的适配器。请帮忙!谢谢!
附加问题:在搜索 View 中键入内容后,如果我点击后退按钮,我希望键盘隐藏并返回 fragment 的标题。我应该怎么做?
fragment
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);
}
}
适配器
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);
}
}
}
最佳答案
解决了!不得不插入一些代码,它终于奏效了!这是我所做的:
在我的 MainActivity
中,我必须将我的 onCreateOptions
方法更改为:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
然后在我 fragment 的 onCreateView
方法中:
setHasOptionsMenu(true);
我还必须为 searchview 和 menuitem 实现监听器:
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();
}
关于android - fragment 中 RecyclerView 上的 SearchView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650870/
我有一个像这样的 fragment 栈 F1 -> F2 -> F3 -> F4 -> F5 现在我需要删除 F2、F3、F4 fragment 。 我需要如果我从 F5 fragment 按下后退按
我需要帮助来理解以下场景的工作原理以及如何实现结果。 我有一个名为 ShoppingCart 的类。它有一个名为 addItemsToShoppingCartFromPreviousOrder 的方法
我有一个包含 ViewPager 的 fragment 。这个 ViewPager 显然是由其他 Fragments 填充的。 我的问题是,ViewPager 中的 Fragment 是否有任何方法(
所以我正在实现一个 FragmentActivity 并尝试添加一个 fragment ,但是我遇到了多个问题。我以前做过这个,实际上我使用的代码与上一个项目(它工作的地方)相同,但由于某种原因它在这
Closed. This question needs details or clarity。它当前不接受答案。
我想将 Android X fragment (androidx.fragment.app.Fragment) 转换为 Android native fragment (android.app.Fra
假设我有一个包含 10 列文本类型 (20) 的 SQLite 表。 ListFragment 将从数据库中提取 4 列并使用 SimpleCursorAdapter 显示在列表中。 选择后,List
我有一个对话框 fragment ,我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是: fragment 与 fragment 管理器无关。 我也尝试过
我想在 View 分页器更改为 fragment 时刷新该 fragment 。 package com.mcivisoft.rcbeam; import android.os.Bundle; imp
我有一个名为的 Activity MainActivity 我在容器 R.id.mainContainer 中添加了 fragment “BenefitFragment”。 在 BenefitFrag
所以我有这个 ClientListView,效果很好,可以显示客户,我可以单击一个客户并在右侧获取他们的详细信息(在我的第二个 fragment 中)。由此处的布局定义: 这很好用,但后来我
我试过这段代码,但点击第一个 fragment 中的按钮并没有改变第二个 fragment 中的字符串值。 这是第一个 fragment 的 kotlin 文件。它有两个按钮,点击它们可以更改字符串值
我有以下情况:我打开 fragment A 和目标,通过按钮的单击事件转到 fragment B。当我在 fragment B 中并点击后退按钮(为了返回 fragment A) 我想将一些参数传递给
我制作了一个 NavigationDrawer fragment ,其中包含 Home、Settings、Feedback 等项目。 home 项在点击 home 时应该打开,home 是在应用程序启
我正在一个接一个地替换 2 个 fragment ,两个 fragment 都有不同的选项菜单。当我替换第二个 fragment 时,它也显示第一个 fragment 的菜单。 setHasOptio
我有问题: android.app.Fragment$InstantiationException: Unable to instantiate fragment ${packageName}.${a
我正在研究 fragment 转换。当我用第二个 fragment 替换第一个 fragment 时,它出现在第一个 fragment 的下方。我希望它移动到第一个 fragment 之上。我该怎么做
我在抽屉导航里总共有 12 个 fragment 。每个 fragment 都有 volley 方法。每个 fragment 都显示自己的 Volley 响应,除了 position = 1 和 po
我在我的 Activity 中使用了两个 fragment 。最初我将向 Activity 添加一个 fragment 。然后在第一个 fragment 中使用监听器我想用第二个 fragment 替
我正在实现一个“fragments-101”程序,当相应的按钮被点击时我会替换一个 fragment 。然而,下面的事情发生了: 为什么会这样?为什么初始 fragment 没有被完全替换?MainA
我是一名优秀的程序员,十分优秀!