在android列表视图中搜索

在android列表视图中搜索,android,listview,android-listview,textwatcher,Android,Listview,Android Listview,Textwatcher,我已在每个listview项目中输入了企业名称、城市和地区。我在列表视图的顶部放置了一个编辑文本,用于搜索过程。 我想按企业名称、城市和地区搜索listview项目,我在编辑文本时使用了文本观察程序,并使用了过滤器;但这是行不通的。我该怎么办 这是我的代码: CustomerShowPointActivity.java:- ListView lv = (ListView) findViewById(R.id.list);

我已在每个listview项目中输入了企业名称、城市和地区。我在列表视图的顶部放置了一个编辑文本,用于搜索过程。 我想按企业名称、城市和地区搜索listview项目,我在编辑文本时使用了文本观察程序,并使用了过滤器;但这是行不通的。我该怎么办

这是我的代码:

CustomerShowPointActivity.java:-

                    ListView lv = (ListView) findViewById(R.id.list);
                    final ShowPointAdapter adapter = new ShowPointAdapter(
                            CustomerShowPointActivity.this, item);
                    lv.setAdapter(adapter);
                    lv.setTextFilterEnabled(true);
                    lv.bringToFront();

                    // Locate the EditText in listview_main.xml
                    editsearch = (EditText) findViewById(R.id.et1);
                    // Capture Text in EditText
                    editsearch.addTextChangedListener(new TextWatcher() {
                        @Override
                        public void onTextChanged(CharSequence s, int start,
                                int before, int count) {

                        }

                        @Override
                        public void beforeTextChanged(CharSequence s, int start,
                                int count, int after) {
                        }

                        @Override
                        public void afterTextChanged(Editable s) {
                            String text = editsearch.getText().toString()
                                    .toLowerCase(Locale.getDefault());
                            adapter.filter(text);
                        }
                    });
这是我的适配器类:-

public class ShowPointAdapter extends BaseAdapter {

// Declare Variables
Context mContext;
LayoutInflater mInflater;
private List<PointItem> item = null;
private ArrayList<PointItem> arraylist;
String search;

public ShowPointAdapter(Context context, List<PointItem> item) {
    mContext = context;
    this.item = item;
    mInflater = LayoutInflater.from(mContext);
    this.arraylist = new ArrayList<PointItem>();
    this.arraylist.addAll(item);
}

public class ViewHolder {
    TextView Bus_name;
    TextView bus_area;
    TextView bus_point;
}

@Override
public int getCount() {
    return item.size();
}

@Override
public PointItem getItem(int position) {
    return item.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

public boolean isEnabled(int position) {
    return false;
}

@Override
public View getView(final int position, View view, ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = mInflater.inflate(R.layout.customer_show_point_item, null);
        holder.Bus_name = (TextView) view
                .findViewById(R.id.item_bname);
        holder.bus_area = (TextView) view
                .findViewById(R.id.item_barea);
        holder.bus_point = (TextView) view
                .findViewById(R.id.bus_point);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    // set the result into textviews
    holder.Bus_name.setText(item.get(position).getbus_name());
    holder.bus_area.setText(item.get(position).getbus_area() + ", "
            + item.get(position).getbus_city());
    holder.bus_point.setText(item.get(position).getcus_bus_point());
    return view;
}

public void filter(String charText) {
    // TODO Auto-generated method stub
    charText = charText.toLowerCase(Locale.getDefault());
    item.clear();
    if (charText.length() == 0) {
        item.addAll(arraylist);
    } else {
        for (PointItem it : arraylist) {
            if (it.getbus_name().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                item.add(it);
            }
        }
    }
    notifyDataSetChanged();
}
}
公共类ShowPointAdapter扩展了BaseAdapter{
//声明变量
语境;
拉平机;
私有列表项=null;
私有ArrayList ArrayList;
字符串搜索;
公共ShowPointAdapter(上下文,列表项){
mContext=上下文;
this.item=项目;
mInflater=LayoutInflater.from(mContext);
this.arraylist=新的arraylist();
this.arraylist.addAll(项);
}
公共类视图持有者{
TextView总线名称;
TextView巴士服务区;
TextView巴士站;
}
@凌驾
public int getCount(){
返回item.size();
}
@凌驾
公共点项目getItem(内部位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共布尔值isEnabled(整型位置){
返回false;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组父视图){
最终持票人;
如果(视图==null){
holder=新的ViewHolder();
视图=最小平坦度。充气(R.layout.customer\u show\u point\u item,空);
holder.Bus_name=(TextView)视图
.findViewById(R.id.项目名称);
holder.bus_区域=(文本视图)视图
.findViewById(R.id.item_barea);
holder.bus_点=(文本视图)视图
.findViewById(R.id.bus_point);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
//将结果设置为文本视图
holder.Bus_name.setText(item.get(position.getbus_name());
holder.bus_area.setText(item.get(position).getbus_area()+“,”
+item.get(position.getbus_city());
holder.bus_point.setText(item.get(position.getcus_bus_point());
返回视图;
}
公共空过滤器(字符串图表文本){
//TODO自动生成的方法存根
charText=charText.toLowerCase(Locale.getDefault());
item.clear();
如果(ChartText.length()==0){
item.addAll(arraylist);
}否则{
for(PointItem it:arraylist){
if(it.getbus_name().toLowerCase(Locale.getDefault())
.contains(图表文本)){
项目。添加(it);
}
}
}
notifyDataSetChanged();
}
}

您需要在适配器中执行过滤并实现可过滤。 接下来,覆盖

   @Override
public Filter getFilter() {
      if (mFilter == null)
      {
          mFilter = new ValueFilter();
      }
    return mFilter;
}
接下来,您需要执行以下操作:

私有类ValueFilter扩展了筛选器{

    //Invoked in a worker thread to filter the data according to the constraint.
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results=new FilterResults();
        if(constraint!=null && constraint.length()>0){
            ArrayList<Vertex> filterList = new ArrayList<Vertex>();
            for(int i=0;i<mStringFilterList.size();i++)
            {
                Vertex v = mStringFilterList.get(i);
                if (v != null)
                {

                    if((v.getTitle().toUpperCase())
                            .contains(constraint.toString().toUpperCase()))
                    {
                        Vertex contacts = null;
                        try {
                            contacts = new Vertex(v.getJSObject());
                            contacts.setTitle(v.getTitle());

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        filterList.add(contacts);
                    }
                }

            }
            results.count=filterList.size();
            results.values=filterList;
        }else{
            results.count=mStringFilterList.size();
            results.values=mStringFilterList;
        }
        return results;
    }


    //Invoked in the UI thread to publish the filtering results in the user interface.
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        mData=(ArrayList<Vertex>) results.values;
        notifyDataSetChanged();
    }
}
//在工作线程中调用,以根据约束筛选数据。
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
if(constraint!=null&&constraint.length()>0){
ArrayList filterList=新建ArrayList();

对于(inti=0;i我的代码中没有使用Holder…只需更改showPointAdapter类代码…使用

final ViewHolder holder;
只需更改适配器类代码:-

public class ShowPointAdapter extends BaseAdapter {


Context mContext;
LayoutInflater mInflater;
private List<PointItem> item = null;
private ArrayList<PointItem> arraylist;
String search;

public ShowPointAdapter(Context context, List<PointItem> item) {
    mContext = context;
    this.item = item;
    mInflater = LayoutInflater.from(mContext);
    this.arraylist = new ArrayList<PointItem>();
    this.arraylist.addAll(item);
}

public class ViewHolder {
    TextView Bus_name;
    TextView bus_area;
    TextView bus_point;
}

@Override
public int getCount() {
    return item.size();
}

@Override
public PointItem getItem(int position) {
    return item.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

public boolean isEnabled(int position) {
    return false;
}

@Override
public View getView(final int position, View view, ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = mInflater.inflate(R.layout.customer_show_point_item, null);
        holder.Bus_name = (TextView) view
                .findViewById(R.id.item_bname);
        holder.bus_area = (TextView) view
                .findViewById(R.id.item_barea);
        holder.bus_point = (TextView) view
                .findViewById(R.id.bus_point);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    // set the result into textviews
    holder.Bus_name.setText(item.get(position).getbus_name());
    holder.bus_area.setText(item.get(position).getbus_area() + ", "
            + item.get(position).getbus_city());
    holder.bus_point.setText(item.get(position).getcus_bus_point());
    return view;
}

public void filter(String charText) {
    // TODO Auto-generated method stub
    charText = charText.toLowerCase(Locale.getDefault());
    item.clear();
    if (charText.length() == 0) {
        item.addAll(arraylist);
    } else {
        for (PointItem it : arraylist) {
            if (it.getbus_name().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                item.add(it);
            }
        }
    }
    notifyDataSetChanged();
}
} 
公共类ShowPointAdapter扩展了BaseAdapter{
语境;
拉平机;
私有列表项=null;
私有ArrayList ArrayList;
字符串搜索;
公共ShowPointAdapter(上下文,列表项){
mContext=上下文;
this.item=项目;
mInflater=LayoutInflater.from(mContext);
this.arraylist=新的arraylist();
this.arraylist.addAll(项);
}
公共类视图持有者{
TextView总线名称;
TextView巴士服务区;
TextView巴士站;
}
@凌驾
public int getCount(){
返回item.size();
}
@凌驾
公共点项目getItem(内部位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共布尔值isEnabled(整型位置){
返回false;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组父视图){
最终持票人;
如果(视图==null){
holder=新的ViewHolder();
视图=最小平坦度。充气(R.layout.customer\u show\u point\u item,空);
holder.Bus_name=(TextView)视图
.findViewById(R.id.项目名称);
holder.bus_区域=(文本视图)视图
.findViewById(R.id.item_barea);
holder.bus_点=(文本视图)视图
.findViewById(R.id.bus_point);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
//将结果设置为文本视图
holder.Bus_name.setText(item.get(position.getbus_name());
holder.bus_area.setText(item.get(position).getbus_area()+“,”
+item.get(position.getbus_city());
holder.bus_point.setText(item.get(position.getcus_bus_point());
返回视图;
}
公共空过滤器(字符串图表文本){
//TODO自动生成的方法存根
charText=charText.toLowerCase(Locale.getDefault());
item.clear();
如果(ChartText.length()==0){
item.addAll(arraylist);
}否则{
for(PointItem it:arraylist){
if(it.getbus_name().toLowerCase(Locale.getDefault())
.contains(图表文本)){
项目。添加(it);
}
}
}
notifyDataSetChanged();
}
}