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

對不起,似乎並沒有這樣做的問題,這不是問題,因爲我的適配器更新時,當我輸入文本,在刪除輸入的字符時它不會恢復到原始狀態,這是我的問題。 –