Android 自定义listview中的搜索选项
我的应用程序中有一个edittext和一个listview我的listview显示联系人列表。 我想要带有edittext的listview过滤器。我在google上搜索了很多,找到了一些examles,但没有一个对我有用。这是我的代码Android 自定义listview中的搜索选项,android,listview,Android,Listview,我的应用程序中有一个edittext和一个listview我的listview显示联系人列表。 我想要带有edittext的listview过滤器。我在google上搜索了很多,找到了一些examles,但没有一个对我有用。这是我的代码 my custom adapter: public class CustomAdapter extends BaseAdapter { Fragment frgmnt; ArrayList<HashMap<String, A
my custom adapter:
public class CustomAdapter extends BaseAdapter
{
Fragment frgmnt;
ArrayList<HashMap<String, ArrayList>> contactarr;
LayoutInflater inflater;
public CustomAdapter(Fragment1 frgmnt, ArrayList<HashMap<String, ArrayList>> contactarr)
{
//
originalData=contactarr;
filteredData=contactarr;
this.frgmnt=frgmnt;
this.contactarr=contactarr;
inflater= (LayoutInflater)getActivity().getSystemServic(Context.LAYOUT_INFLATER_SERVICE);
this.contactarrsrch=new ArrayList<HashMap<String, ArrayList>>();
this.contactarrsrch.addAll(contactarr);
}
@Override
public int getCount()
{
return filteredData.size();
}
@Override
public Object getItem(int position)
{
return filteredData.get(position);
//return null;
}
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent)
{
if(view==null)
{
view=inflater.inflate(R.layout.list_data,null);
}
LinearLayout ll_row =(LinearLayout) view.findViewById(R.id.ll_row);
TextView txtContact = (TextView) view.findViewById(R.id.contact_name);
HashMap<String, ArrayList> map=contactarr.get(position);
ArrayList name =map.get("Name_");
txtContact.setText(name.get(0).toString());
return view;
}
}
this is in onCrate():
InputSearch.addTextChangedListener(new TextWatcher()
{
final ArrayList<HashMap<String,ArrayList>> tempArrayList =new ArrayList<HashMap<String,ArrayList>>(contactarr1);
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
String text = InputSearch.getText().toString().toLowerCase(Locale.getDefault());
//adapter.getFilter(s.toString());
int textlength = s.length();
for (HashMap<String, ArrayList> wp : tempArrayList)
{
if(textlength<=wp.get("Name_").toString().length())
{
if (( wp.get("Name_").toString()).toLowerCase().contains(s.toString().toLowerCase()))
{
tempArrayList.add(wp);
}
}
}
adapter=new CustomAdapter(Fragment1.this, tempArrayList);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{}
@Override
public void afterTextChanged(Editable s)
{}
});
我的自定义适配器:
公共类CustomAdapter扩展了BaseAdapter
{
片段frgmnt;
ArrayList contactarr;
充气机;
公共CustomAdapter(Fragment1 frgmnt,ArrayList contactarr)
{
//
originalData=contactarr;
filteredData=联系人arr;
这个。frgmnt=frgmnt;
this.contactarr=contactarr;
充气器=(LayoutFlater)getActivity().getSystemServic(Context.LAYOUT\u充气器\u服务);
this.contactarrsrch=newArrayList();
this.contactarrsch.addAll(contactarr);
}
@凌驾
public int getCount()
{
返回filteredData.size();
}
@凌驾
公共对象getItem(int位置)
{
返回filteredData.get(位置);
//返回null;
}
@凌驾
公共长getItemId(int位置)
{
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图)
{
如果(视图==null)
{
视图=充气机充气(右布局列表数据,空);
}
LinearLayout ll_行=(LinearLayout)view.findViewById(R.id.ll_行);
TextView txtContact=(TextView)view.findViewById(R.id.contact\u name);
HashMap map=contactarr.get(位置);
ArrayList name=map.get(“name_”);
setText(name.get(0.toString());
返回视图;
}
}
这在onCrate()中:
InputSearch.addTextChangedListener(新的TextWatcher()
{
最终ArrayList tempArrayList=新ArrayList(contactarr1);
@凌驾
public void onTextChanged(字符序列、int start、int before、int count)
{
String text=InputSearch.getText().toString().toLowerCase(Locale.getDefault());
//getFilter(s.toString());
int textlength=s.length();
for(HashMap wp:tempArrayList)
{
如果(textlength您应该像这样创建自定义适配器:
public class CompanyListAdapter extends BaseAdapter implements Filterable {
private List<Company> companies;
private List<Company> filteredCompanies;
private CompanyFilter mFilter = new CompanyFilter();
private Context context;
public CompanyListAdapter(Context context, ArrayList<Company> products) {
super(context, R.layout.company_list_item, products);
this.context = context;
this.products = products;
this.filteredCompanies = products;
}
@Override
public int getCount() {
return filteredCompanies == null 0 : filteredCompanies.size();
}
@Override
public Company getItem(int position) {
return filteredCompanies.get(position);
}
@Override
public Filter getFilter() {
return mFilter;
}
}
要在片段
或活动
中使用此功能,您应该在编辑文本
中添加一个文本观察者
,并进行相应过滤:
txtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
});
声明
private ArrayAdapter<String> xListAdapter;
EditText xSearchParty;
文本更改侦听器
xSearchParty.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
// When user changed the Text
FILENAME.this.xListAdapter.getFilter().filter(cs);
}
});
我希望此代码可以解决您的问题,但它不适用于自定义适配器。如果我有CustomAdapter,该怎么办?我已经更新了我的代码以便与BaseAdapter
一起使用,请查看。在这一行adapter=new CustomAdapter(Fragment1.this,tempArrayList)
在更改文本的筛选数据后,您刚刚初始化了适配器
,但尚未在listview中设置该适配器,您也需要刷新适配器。因此存在问题。因此,再写两行listview.setAdapter(适配器);
适配器.notifyDatasetChanged();
@piyush现在我添加了这个,但是当我在文本框中键入内容时,列表变为空。没有显示任何记录是的,这意味着您没有在listview中设置适配器。要在自定义listview上进行过滤,您可以尝试此[1].[1]:我创建了一个自定义适配器,而不是简单的ArrayAdapter。如果是自定义适配器,该怎么办?有人来帮忙吗?
xLvParty = (ListView) findViewById(R.id.lvparty);
xSearchParty = (EditText) findViewById(R.id.inputSearch);
xSearchParty.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
// When user changed the Text
FILENAME.this.xListAdapter.getFilter().filter(cs);
}
});