Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按SearchView的查询筛选ListView-我做错了什么?_Java_Android_Listview_Searchview - Fatal编程技术网

Java 按SearchView的查询筛选ListView-我做错了什么?

Java 按SearchView的查询筛选ListView-我做错了什么?,java,android,listview,searchview,Java,Android,Listview,Searchview,正如主题名称所提到的,当我试图实现实时ListView过滤时,当用户在位于操作栏的搜索栏中输入一些文本时,我面临一个问题。 另外,在调试应用程序时,我甚至没有在日志中打印Log.iNomad、onQueryTextChange和onQueryTextChange:/ AllLists.java public class AllLists extends Fragment implements SearchView.OnQueryTextListener{ private TypedArray

正如主题名称所提到的,当我试图实现实时ListView过滤时,当用户在位于操作栏的搜索栏中输入一些文本时,我面临一个问题。 另外,在调试应用程序时,我甚至没有在日志中打印Log.iNomad、onQueryTextChange和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();
        }
    };
}
}

必须在onQueryTextChange中的adapter.getFilter.filters之后键入listView.setAdapteradapter。这将刷新列表视图

那么,您可以试试这个..不要执行SearchView.onQueryTextChangeListner。。 而是在onCreateView中编写以下内容

        mSearchView.setOnQueryTextListener(new OnQueryTextListener() 
        {

        @Override
        public boolean onQueryTextSubmit(String query) {
            // TODO Auto-generated method stub

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

                //your code here                
            return false;
        }

    });

当我向searchview写入一些文本进行筛选时,它不会筛选listview。为什么要实现两个OnQueryTextListeners?请发布更正的代码好吗?我没有主意了,我还能做些什么…我还不确定哪里出了问题,但我注意到您使用了2 OnQueryTextListener。这里的一个实现SearchView.onquerytextener,第二个实现mSearchView.setonquerytextener新的SearchView.onquerytextener。删除其中一个并将一些日志放入您保留的日志中,然后查看当您键入某些文本时侦听器是否会触发。我尝试分别删除两个OnQueryTextListener,但没有帮助…这与我没有日志这一事实无关。iNomad,onQueryTextChange;打印在我的日志中…我无法理解你的评论。我要说的是,在onQueryTextChange方法中,您正在执行adapter.getFilter.filters。在此之后,您需要调用listView.setAdapteradapter。这将刷新listview中的数据;完全没有打印,当我调试应用程序并输入查询时…那么,您可以尝试以下操作..不要实现SearchView.onQueryTextChangeListner..而是在onCreateView中编写以下代码