我的应用中有一个列表视图,如下所示:
- img-- --ArrayListItems(names)--- --- TextView ----
我正在使用带有搜索视图的Action bar sherlock来使应用程序反向兼容。 我正在使用自定义适配器扩展Base Adapter并实现可过滤。我真正需要的是,当用户在搜索栏中输入文本时,我应该能够根据ArrayListItems(名称)过滤列表视图。我在stackoverflow上提到了几个帖子,尝试了所有代码片段。但我仍然无法搜索。当我运行代码时,搜索栏什么都不做。
在我的活动中,我做了:
public class SearchViewActionBar extends SherlockActivity implements SearchView.OnQueryTextListener
{
public SearchView mSearchView;
private TextView mStatusView;
int mSortMode = -1;
protected CharSequence[] _options = { "Wild Life", "River", "Hill Station", "Temple", "Bird Sanctuary", "Hill", "Amusement Park"};
protected boolean[] _selections = new boolean[ _options.length ];
private final String[] mStrings = Cheeses.sCheeseStrings;
ListView lv1;
ItemListBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
ArrayList<ItemDetails> image_details = GetSearchResults();
lv1= (ListView) findViewById(R.id.list_view);
adapter=new ItemListBaseAdapter(this, image_details);
lv1.setAdapter(adapter);
lv1.setTextFilterEnabled(true);
mSearchView = (SearchView) findViewById(R.id.action_search);
/*lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Object o = lv1.getItemAtPosition(position);
ItemDetails obj_itemDetails = (ItemDetails)o;
//Toast.makeText(ListViewImagesActivity.this, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show();
}
});*/
}
private ArrayList<ItemDetails> GetSearchResults()
{
ArrayList<ItemDetails> results = new ArrayList<ItemDetails>();
for(int i=0;i<mStrings.length;i++)
{
ItemDetails item_details = new ItemDetails();
item_details.setName(mStrings[i]);
item_details.setItemDescription("200");
results.add(item_details);
}
return results;
}
private void setupSearchView() {
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
mSearchView.setSubmitButtonEnabled(false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.searchview_in_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchItem.getActionView();
setupSearchView();
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
if (mSortMode != -1)
{
//Drawable icon = menu.findItem(mSortMode).getIcon();
//menu.findItem(R.id.action_sort).setIcon(icon);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
//case R.id.action_search:
//finish();
//getSupportActionBar().setDisplayShowHomeEnabled(false);
//getSupportActionBar().setDisplayShowTitleEnabled(false);
//System.out.println("search pressed");
//break;
case R.id.action_edit:
System.out.println("category pressed");
showDialog( 0 );
//finish();
break;
default:
//return super.onOptionsItemSelected(item);
break;
}
/*
String c="Category";
if(s.equals(c))
{
System.out.println("same");
;
}*/
//Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
protected Dialog onCreateDialog( int id )
{
return
new AlertDialog.Builder( this )
.setTitle( "Category" )
.setMultiChoiceItems( _options, _selections, new DialogSelectionClickHandler() )
.setPositiveButton( "SAVE", new DialogButtonClickHandler() )
.create();
}
public class DialogSelectionClickHandler implements DialogInterface.OnMultiChoiceClickListener
{
public void onClick( DialogInterface dialog, int clicked, boolean selected )
{
Log.i( "ME", _options[ clicked ] + " selected: " + selected );
}
}
public class DialogButtonClickHandler implements DialogInterface.OnClickListener
{
public void onClick( DialogInterface dialog, int clicked )
{
switch( clicked )
{
case DialogInterface.BUTTON_POSITIVE:
printSelectedPlanets();
break;
}
}
}
protected void printSelectedPlanets()
{
for( int i = 0; i < _options.length; i++ ){
Log.i( "ME", _options[ i ] + " selected: " + _selections[i] );
}
}
public void onSort(MenuItem item)
{
mSortMode = item.getItemId();
invalidateOptionsMenu();
}
public boolean onQueryTextChange(String newText)
{
/*ActionBar ab = getSupportActionBar();
ab.setDisplayShowTitleEnabled(false);
ab.setDisplayShowHomeEnabled(false);*/
//getSupportActionBar().setDisplayShowHomeEnabled(false);
//getSupportActionBar().setDisplayShowTitleEnabled(false);
if (TextUtils.isEmpty(newText))
{
System.out.println("empty query");
lv1.clearTextFilter();
}
else
{
//System.out.println(newText.toString());
adapter.getFilter().filter(newText);
//adapter.getFilter().filter(s);
//lv1.setFilterText(newText.toString());
}
return true;
}
public boolean onQueryTextSubmit(String query)
{
mStatusView.setText("Query = " + query + " : submitted");
return false;
}
public boolean onClose()
{
mStatusView.setText("Closed!");
return false;
}
protected boolean isAlwaysExpanded()
{
return false;
}
}
我的适配器类:
public class ItemListBaseAdapter extends BaseAdapter implements Filterable
{
private static ArrayList<ItemDetails> itemDetailsrrayList,list;
private Integer[] imgid = {
//R.drawable.p1,
R.drawable.bb2,
/*R.drawable.p2,
R.drawable.bb5,
R.drawable.bb6,
R.drawable.d1*/
};
private LayoutInflater l_Inflater;
public ItemListBaseAdapter(Context context, ArrayList<ItemDetails> results) {
itemDetailsrrayList = results;
l_Inflater = LayoutInflater.from(context);
}
public int getCount() {
return itemDetailsrrayList.size();
}
public Object getItem(int position) {
return itemDetailsrrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if (convertView == null) {
convertView = l_Inflater.inflate(R.layout.item_details_view, null);
holder = new ViewHolder();
holder.txt_itemName = (TextView) convertView.findViewById(R.id.textView1);
holder.txt_itemDescription = (TextView) convertView.findViewById(R.id.textView2);
//holder.txt_itemPrice = (TextView) convertView.findViewById(R.id.phone);
holder.itemImage = (ImageView) convertView.findViewById(R.id.imageView1);
convertView.setTag(holder);
} else
{
holder = (ViewHolder) convertView.getTag();
}
holder.txt_itemName.setText(itemDetailsrrayList.get(position).getName());
//holder.txt_itemDescription.setText(itemDetailsrrayList.get(position).getItemDescription());
holder.txt_itemDescription.setText("200");
//holder.txt_itemPrice.setText(itemDetailsrrayList.get(position).getPrice());
//holder.itemImage.setImageResource(imgid[itemDetailsrrayList.get(position).getImageNumber() - 1]);
holder.itemImage.setImageResource(imgid[0]);
return convertView;
}
static class ViewHolder
{
TextView txt_itemName;
TextView txt_itemDescription;
//TextView txt_itemPrice;
ImageView itemImage;
}
public Filter getFilter()
{
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
list = (ArrayList<ItemDetails>) results.values; // has the filtered values
notifyDataSetChanged(); // notifies the data with new filtered values
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
List<String> FilteredArrList = new ArrayList<String>();
if (list == null) {
list = new ArrayList<ItemDetails>(list); // saves the original data in mOriginalValues
}
/********
*
* If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
* else does the Filtering and returns FilteredArrList(Filtered)
*
********/
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = list.size();
results.values = list;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < list.size(); i++)
{
String data="b";
//= list.getName(i);
if (data.toLowerCase().startsWith(constraint.toString())) {
FilteredArrList.add(data);
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
};
return filter;
}
}
答案 0 :(得分:2)
您必须向searchView添加TextWatcher,如下所示:
mSearchView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}}
注意:
Filter使用ItemDetails类的toString方法。您必须覆盖toString进行过滤。
答案 1 :(得分:1)
我在这里发布了一个答案:https://stackoverflow.com/a/12363961/450534这是基于我几天前的一个问题:Filtering a ListView with Baseadapter filters text not images。
我在问题中遇到的问题是文本会因图像不匹配而被过滤。发布的答案解决了这个问题。答案中也提到的解决方案是针对GridView
,但对ListView
也很有效。
这是一个非常冗长的答案,所以我只是链接而不是在这里重新发布。它有完整的BTW解决方案,应该可以帮到你。