2014-12-07 60 views
0

正如该主题的名字所提到的,当我尝试实现实时ListView过滤时,当用户在位于操作栏中的搜索栏中输入一些文本时,我遇到了一个问题。 P.S.我甚至没有甲肝Log.i( “保荐人”, “onQueryTextChange”)在onQueryTextChange()在日志中打印,当我调试的应用程序:/通过SearchView的查询过滤ListView - 我做错了什么?

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(); 
     } 
    }; 
} 
} 
+0

什么错误? – 2014-12-07 17:33:05

+0

当我向searchview写入一些文本进行过滤时,它不会过滤listview。 – Sharptax 2014-12-07 18:50:35

+0

你为什么实现两个OnQueryTextListeners? – 2014-12-07 18:59:18

回答

0

您必须键入listView.setAdapter(适配器)adapter.getFilter后()。滤波器(收费)onQueryTextChange。这将刷新listView。

+0

这与事实没有关系,即我没有Log.i(“Nomad”,“onQueryTextChange”);打印在我的日志中... – Sharptax 2014-12-08 13:34:53

+0

我无法理解你的评论,我所说的只是在你的onQueryTextChange方法中,你正在做adapter.getFilter().filter(s),在这之后,你需要调用listView.setAdapter(adapter)。这将刷新列表视图中的数据 – 2014-12-08 15:02:07

+0

所有我想解释的是,OnQueryTextListener不会被执行,因为Log.i(“Nomad”,“onQueryTextChange”);根本不会被打印,我正在调试应用程序和输入查询... – Sharptax 2014-12-08 16:30:53

0

那么,你可以尝试做this..Don't实现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; 
     } 

    });