0

我想添加一个搜索文本框到我的列表视图,以便做一些过滤和我的列表适配器使用自定义对象而不是简单的字符串。该搜索似乎乍一看,但适配器不更新,如果我删除过滤字符串。ListView过滤问题Android

下面是我曾尝试:

这是我的自定义ArrayAdapter

public class ArticolAdapter extends OrderManagerAdapter<Articol> implements Scrollable { 
    private List<Articol> orderList; 
    private final LayoutInflater inflater; 
    private final Context context; 

    public ArticolAdapter(Context context, List<Articol> objects) { 
     super(context, objects); 
     this.inflater = LayoutInflater.from(context); 
     this.orderList = objects; 
     this.context = context; 
    } 

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.item_articol, parent, false); 
      holder = new ViewHolder(); 

      holder.name = (TextView) convertView.findViewById(R.id.numeTV); 
      holder.deLivrat = (TextView) convertView.findViewById(R.id.de_livrat); 
      holder.articolPoza = (ImageView) convertView.findViewById(R.id.pictureCategory); 
      holder.observatiiTV = (TextView) convertView.findViewById(R.id.observatii); 
      holder.incarcatTV = (TextView) convertView.findViewById(R.id.incarcat); 
      holder.background = (RelativeLayout) convertView.findViewById(R.id.expandable_toggle_button); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final Articol articol = getItem(position); 
     holder.name.setText(articol.getNume()); 
     System.out.println(articol.getNume()); 
     holder.deLivrat.setText("De livrat: " + Constants.DF.format(articol.getComandat())); 
     holder.incarcatTV.setText("Incarcat: " + fmt(articol.getIncarcat())); 
     holder.observatiiTV.setText("Observatii: " + articol.getObservatii()); 
     holder.background.setPadding(5, 5, 5, 5); 
     if (articol.getComandat() == articol.getIncarcat()) { 
      holder.background.setBackground(context.getResources().getDrawable(R.drawable.list_item_completed)); 
     } else { 
      holder.background.setBackground(context.getResources().getDrawable(R.drawable.list_item_bg)); 
     } 
     return convertView; 
    } 

    public static String fmt(double d) { 
     if (d == (int) d) 
      return String.format("%d", (int) d); 
     else 
      return String.format("%s", d); 
    } 

    @Override 
    public String getIndicatorForPosition(int childposition, int groupposition) { 
     return Character.toString(orderList.get(childposition).getNume().charAt(0)); 
    } 

    @Override 
    public int getScrollPosition(int childposition, int groupposition) { 
     return childposition; 
    } 

    private class ViewHolder { 
     private TextView name, deLivrat, observatiiTV, incarcatTV; 
     private ImageView articolPoza; 
     private RelativeLayout background; 
    } 

    private List<Articol> orig; 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       final FilterResults oReturn = new FilterResults(); 
       final ArrayList<Articol> results = new ArrayList<Articol>(); 
       if (orig == null) { 
        orig = orderList; 
       } 
       if (constraint != null) { 
        if (orig != null && orig.size() > 0) { 
         for (final Articol g : orig) { 
          if (g.getNume().toLowerCase() 
            .contains(constraint.toString())) { 
           results.add(g); 
          } 
         } 
        } 
        oReturn.values = results; 
       } 
       return oReturn; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
              FilterResults results) { 
       orderList = (ArrayList<Articol>) results.values; 
       notifyDataSetChanged(); 
       clear(); 
       for (Articol anOrderList : orderList) { 
        add(anOrderList); 
       } 
       notifyDataSetInvalidated(); 
      } 
     }; 
    } 

} 

OrderManagerAdapter

public class OrderManagerAdapter<T> extends ArrayAdapter<T> { 

    private final List<T> objects; 
    private final Object mLock; 

    public OrderManagerAdapter(Context context) { 
     super(context, 0); 
     objects = new ArrayList<T>(); 
     mLock = new Object(); 
     setNotifyOnChange(false); 
    } 

    public OrderManagerAdapter(Context context, List<T> objects) { 
     super(context, 0); 
     this.objects = objects; 
     mLock = new Object(); 
    } 

    @Override 
    public void add(T object) { 
     synchronized (mLock) { 
      objects.add(object); 
     } 
    } 

    @Override 
    public void addAll(Collection<? extends T> collection) { 
     synchronized (mLock) { 
      objects.addAll(collection); 
     } 
    } 

    @Override 
    public void insert(T object, int index) { 
     synchronized (mLock) { 
      objects.add(index, object); 
     } 
    } 

    @Override 
    public void remove(T object) { 
     synchronized (mLock) { 
      objects.remove(object); 
     } 
    } 

    @Override 
    public void clear() { 
     synchronized (mLock) { 
      objects.clear(); 
     } 
    } 

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

    @Override 
    public T getItem(int position) { 
     return objects.get(position); 
    } 

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

    @Override 
    public int getPosition(T item) { 
     return objects.indexOf(item); 
    } 

    public List<T> getObjects() { 
     return objects; 
    } 
} 

,这是我的片段里面EditText代码:

EditText inputSearch = (EditText) rootView.findViewById(R.id.inputSearch); 
     inputSearch.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       Log.d(Constants.TAG, "*** Search value changed: " + s.toString()); 
       adapter.getFilter().filter(s); 
      } 
     }); 

搜索似乎是第一次过滤的工作,在某种意义上说,我键入一些过滤器字符串,列表得到更新,但是当我清除文本我看不到显示的原始列表,我得到一个空的列表。

+0

因为你可能会删除列表中的所有元素listList显示代码适配器 – KOTIOS

+0

更新与适配器代码 –

回答

1
  1. OrderManagerAdapter不应该扩展ArrayAdapter。你重写了足够多的方法,这使得ArrayAdapter在很大程度上无关紧要。另外,你并不是重写所有的mutate方法,这意味着如果你调用其中一个方法,你可能会陷入一些非常麻烦的麻烦。

  2. 没有一个OrderManagerAdapter mutate方法正在调用notifyDataSetChange。没有它们,适配器将无法正确更新。

  3. 事实上,为什么甚至会重写ArrayAdapter,当它出现时,你想要它提供的所有功能?您的OrderManagerAdapter没有正确完成,只会导致更多问题。你最好去掉OrderManagerAdapter并让ArticolAdapter扩展ArrayAdapter。

  4. 你的过滤器是完全不正确的:

    一)执行在后台线程和你身边所有的列表修改零点同步块。

    b)它完全改变适配器的List引用,这意味着OrderManagerAdapter不会指向与ArticolAdapter相同的数据列表,并且所有未来尝试修改适配器都将失败。

    C)它还每一滤波后的数据无效...这基本上意味着你的适配器死,不应该报告任何更多的数据变化

我不知道你的最终目标是什么,但如果您只需要一个简单的方法来自定义ArrayAdapter的过滤结果,只需使用this guy即可。它会为你节省一大堆头痛。

+0

我最终使用了您为滤波适配器提出的解决方案,它的功能就像一个魅力,非常感谢! –

0

看起来你还没有刷新你的列表视图adapter.notifyDataSetChanged();将数据重新分配给适配器之后,再向。首先更新你的dapter,然后调用adapter.notifyDataSetChanged();在您的活动中

+0

对不起,似乎并没有这样做的问题,这不是问题,因为我的适配器更新时,当我输入文本,在删除输入的字符时它不会恢复到原始状态,这是我的问题。 –