【问题标题】:searching in android listview在 android listview 中搜索
【发布时间】:2014-09-08 12:48:08
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

    标签: android listview android-listview textwatcher


    【解决方案1】:

    我没有在我的代码中使用 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();
    }
    } 
    

    【讨论】:

      【解决方案2】:

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

         @Override
      public Filter getFilter() {
            if (mFilter == null)
            {
                mFilter = new ValueFilter();
            }
          return mFilter;
      }
      

      接下来您需要执行以下操作:

      私有类 ValueFilter 扩展 Filter {

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

      现在可能一切正常)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 2015-07-24
        相关资源
        最近更新 更多