2

カスタムアダプターを使用したListViewがArrayAdapterを拡張しています。各項目はオブジェクトです:

public class ListItemObject {

    public String messageText;
    public long messageTime;
    public long fromId;
    public long toId;

}

フィルタリング切り替えのメニューにチェック項目を追加したい。したがって、このアイテムがチェックされていない場合、すべてのアイテムが表示されます。このアイテムがチェックされている場合、ListView には、次の条件でフィルター処理されたアイテムのみが含まれている必要があります。

if(fromId==myId || toId==myId) {
//show item
} else {
//don't show item
}

これを実装するには、次の 2 つの方法があります。

  1. 独自のフィルターを作成する Filter を拡張します。次に、adapter.getFilter().filter(string_with_fromId_and_toId_in_JSON) を呼び出します。ここに 1 つの問題があります。すべての外観アダプターにフィルターを 1 つしか含めることができません。そして、将来別のフィルターを追加したい場合、それはできません。

  2. アダプターの外部にあるすべてのアイテムを保存し、クリアして、フィルター処理されたデータを再度入力します。それは私にとって便利な方法ではありませんが、私にはできます。

これを実装するにはどうすればよいですか?

4

1 に答える 1

2

私は両方を使用しました。のようなフラグを作成し、パラメーターFILTER_BY_CUSTOM_COLLECTIONとしてフィルター関数に送信しconstraintます。制約がフラグと等しい場合は、カスタム フィルターを実行します。それ以外の場合は、その制約を実際のテキスト制約として使用します。

MyFilter filter = (MyFilter) adapterDocumentDetails.getFilter();

filter.itemsForFilterResult = anyCollection

filter.filter(MyFilter.FILTER_BY_CUSTOM_COLLECTION,
            new FilterListener() {
                @Override
                public void onFilterComplete(int count) {

                }
            });

私のフィルターで:

   public final static String FILTER_BY_CUSTOM_COLLECTION = "@@FILTER_BY_CUSTOM_COLLECTION@@";
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

    if (constraint.toString().compareTo(
                                    FILTER_BY_CUSTOM_COLLECTION) == 0
                                    && itemsForFilterResult != null) 
    {
       filteredCollection = itemsForFilterResult;
    }
    else
    {
       for (int i = 0; i < allItems.size(); i++) 
       {
         ListItemObject  item= allItems.get(i);
         if(item.messageText.contains(constraint))
         {
            filteredCollection.add(item);
         }
       }    
    }
 }
于 2012-12-31T10:35:26.057 に答える