2015-08-10 1 views
1

У меня есть POJO:Фильтрация ListView пользовательских POJO путем их полей

public class RoomData implements Parcelable { 
    private String objectId, name, building, floor, imageUrl; 
    private boolean hasPc, hasProjector, hasTelepresence, hasWhiteboard; 
    private boolean dataReady = false; 
    private ArrayList<MeetingData> meetingData = new ArrayList<MeetingData>(); 
    private int capacity; 
    private ArrayList<BeaconData> beacons = new ArrayList<BeaconData>(); 
    private DateTime nextAvailableStart, nextAvailableEnd; 
    private boolean availableNow = false; 
    private ArrayList<Interval> meetingDuringIntervals = new ArrayList<Interval>(); 
} 

, заполняемый в пользовательских ListView/ListAdapter.

Я хочу знать, как я могу фильтровать этот список по полям моего POJO. Например, если я создаю объект RoomFilter, это означает, что мое целое число capacity должно быть выше X. Как это реализовать? Я могу только найти ссылки на filtering по типам primitive данных ...

Вот мой заказ Adapter класс:

public class BeaconAdapter extends BaseAdapter { 
    private Context context; 
    private ArrayList<BLEDeviceAdvertisement> beaconArrayList = new ArrayList<BLEDeviceAdvertisement>(); 

    private static LayoutInflater inflater = null; 

    //BeaconAdapter for the custom ListView 
    public BeaconAdapter(Context context, ArrayList<BLEDeviceAdvertisement> beaconArrayList) { 
     this.beaconArrayList = beaconArrayList; 
     this.context = context; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public BLEDeviceAdvertisement getItem(int position) { 
     return beaconArrayList.get(position); 
    } 


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

    //Custom getview for the custom layout beacon_row_item. 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View myCustomView = convertView; 

     if (myCustomView == null) 
      myCustomView = inflater.inflate(R.layout.beacon_row_item, null); 

     return myCustomView; 
    } 

} 
+0

Просто пройдите по списку, отфильтровывая то, что вам не нужно. Или, если вам нужно изменить фильтры, вы можете сохранить новый список, который является представлением по всему списку. Затем вы используете список в целом по списку в адаптере. –

+0

Сделал именно это. Работает отлично. Отправьте его, и я соглашусь в качестве решения. Спасибо @Gil – Tukajo

+0

сделано, не проблема :) –

ответ

1

После запроса OP, я отправлю свой комментарий в качестве ответа на будущее, давая больше деталей. Вот несколько возможных решений:

  1. Деструктивное обновление: Прокрутите список, отфильтровывая то, что вам не нужно. Внедрите адаптер на основе этого списка.

  2. Виртуальный вид: реализация логики для «виртуального представления» над исходным списком. Здесь вы сохраняете только исходный список, но в все методы адаптера вы пропускаете элементы, которые не соответствуют фильтру. Например, в getItem(int pos) вы просматриваете список, поддерживающий счетчик, но вы увеличиваете его, только если элемент соответствует фильтру: когда счетчик равен pos, вы возвращаете элемент. Аналогичен для других методов.

  3. Concrete View: используйте дополнительный список, чтобы сохранить «представление» над исходным списком, чтобы кэшировать вычисления, выполненные в 2. Когда фильтр установлен/обновлен, цикл через исходный список создает «представление» », а затем вы реализуете адаптер на основе« представления ». Более эффективное время, но и больше потребляемой памяти.

Смежные вопросы