2013-07-25 42 views
0

我有一个ListView与名称的人和一个ActionBar与搜索小部件。 我想要做的是将包含搜索查询的ListView中的第一项聚焦为子字符串。Android ListView搜索和焦点

例如,如果我有一个名为“John Doe”的人,并且我搜索“hn D”行,只要它是第一个包含“hn D”作为子字符串的行,就应该关注它。

请注意,我不希望从列表中删除不包含子字符串的项目。

这就是我如何制作清单。

activity_main.xml中

<ListView android:id="@+id/list_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

list_item.xml

<TextView 
    android:id="@+id/name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="10dip" 
    android:textSize="16sp" 
    android:textStyle="bold" /> 

MainActivity.java

String[] names = {"John Doe","Mark Marky","Donald Duck","Derp Derpson"}; 
lv = (ListView) findViewById(R.id.list_view); 
adapter = new ArrayAdapter<String>(this,R.layout.list_item, R.id.name, names); 
lv.setAdapter(adapter); 

我也有一个带有搜索小部件的操作栏,我实现了onQueryTextChange()onQueryTextSubmit()方法。

问题是如何在这些方法中搜索列表,以及如何关注适当的列表项?

+0

嗯,我不太确定,但我认为你可以使用'String.co获取包含你的搜索的第一个元素的索引ntains()'在'String []'的每个元素上。如果你得到这个索引,你可以使用'mListView.requestFocus();'&'mListView.setSelection(position);' –

回答

1

为了你可以在你的适配器

public class Adapter extends BaseAdapter implements Filterable { 

@Override 
public Filter getFilter() { 

    Filter filter = new Filter() { 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      //do you work 
      notifyDataSetChanged(); 
     } 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      FilterResults results = new FilterResults(); 
      List<Object> searchedList = new ArrayList<Object>(); 



      results.count = searchedList.size(); 
      results.values = searchedList; 
      return results; 
     } 
    }; 
    return filter; 
} 

} 

使用过滤器并使用它像文本搜索:

private void searchAction(String query) { 
    youradapter.getFilter().filter(_query); 
} 
1

searchedittext.addTextChangedListener(新TextWatcher(){

 @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      YourActivity.this.youradapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 

     } 
    });