【发布时间】:2014-12-07 15:44:23
【问题描述】:
正如主题名称所提到的,当我尝试实现实时 ListView 过滤时,当用户在位于操作栏中的搜索栏中输入一些文本时,我遇到了一个问题。 附言当我调试应用程序时,我什至没有在日志中打印 onQueryTextChange() 中的 Log.i("Nomad", "onQueryTextChange") :/
AllLists.java
public class AllLists extends Fragment implements SearchView.OnQueryTextListener{
private TypedArray navMenuIcons;
private Context context;
private int position = 0;
private String location;
private List<Item> items = new ArrayList<Item>();
private ListView listView;
private CustomListAdapter adapter;
private SearchView mSearchView;
public AllLists(Context context) {
this.context = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.alllists, container, false);
View header = inflater.inflate(R.layout.list_header, null);
// View list_view = inflater.inflate(R.layout.list_item, null);
ImageView image = (ImageView) header.findViewById(R.id.small_icon);
header.setClickable(false);
// ImageView logo = (ImageView) list_view.findViewById(R.id.image);
navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
Bundle bundle = getArguments();
position = bundle.getInt("position");
location = bundle.getString("location");
image.setImageDrawable(navMenuIcons.getDrawable(position));
DatabaseHandler db = new DatabaseHandler(context);
items = db.getAllItems(location);
listView = (ListView) rootView.findViewById(R.id.list);
adapter = new CustomListAdapter(context, items);
listView.setAdapter(adapter);
listView.addHeaderView(header);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (location.equals("accommodation") || location.equals("eat") || location.equals("events")
|| location.equals("entertainment") || location.equals("places") || location.equals("cinema")) {
Intent i = new Intent(context, ItemScreen.class);
i.putExtra("position", position - 1);
i.putExtra("location", location);
startActivity(i);
}
}
});
setHasOptionsMenu(true);
return rootView;
}
/*SearchView.OnQueryTextListener(new SearchView.OnQueryTextListener){
}*/
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
adapter.getFilter().filter(s);
return false;
}
});
}
@Override
public boolean onQueryTextChange(String s) {
Log.i("Nomad", "onQueryTextChange");
adapter.getFilter().filter(s);
return false;
}
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
}
CustomListAdapter.java
public class CustomListAdapter extends BaseAdapter {
private Context context;
private List<Item> items;
private LayoutInflater inflater;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
private List<Item> filteredData;
public CustomListAdapter(Context context, List<Item> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.list_item, null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
NetworkImageView image = (NetworkImageView) convertView.findViewById(R.id.image);
TextView name = (TextView) convertView.findViewById(R.id.name);
TextView type = (TextView) convertView.findViewById(R.id.type);
Item i = items.get(position);
// Log.d("FOTO linkas: " + i.getName() + " ", i.getIcon());
if (i.getIcon().contains("http")) {
// Log.d("suveike: ", i.getIcon());
image.setImageUrl(i.getIcon(), imageLoader);
}/*else if(items.get(0).getName().contains("taksi")) {
Log.d("suveike: ", "else if");
image.setImageResource(R.drawable.logo);
}*/ else
image.setImageResource(R.drawable.logo);
name.setText(i.getName());
type.setText(i.getType());
return convertView;
}
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults();
if (charSequence == null || charSequence.length() == 0) {
results.values = items;
results.count = items.size();
} else {
List<Item> filtered_items = new ArrayList<Item>();
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getName().contains(charSequence))
filtered_items.add(items.get(i));
}
results.values = filtered_items;
results.count = filtered_items.size();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
filteredData = (List<Item>) filterResults.values;
notifyDataSetChanged();
}
};
}
}
【问题讨论】:
-
当我将一些文本写入搜索视图进行过滤时,它不会过滤列表视图。
-
为什么要实现两个 OnQueryTextListener?
-
能否请您发布更正后的代码?我没有想法,我还能做什么......
-
我还不确定出了什么问题,但我注意到您使用了 2 个 OnQueryTextListener。这里的一个实现 SearchView.OnQueryTextListener,第二个实现 mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()。删除其中一个并将一些日志放入您保留的日志中,看看当您键入一些文本时是否触发了侦听器。
-
我曾尝试分别删除两个 OnQueryTextListener,但没有帮助...
标签: java android listview searchview