我有一個列表視圖與汽車,如汽車名稱,汽車的一些細節。我想通過它的名字找到一輛汽車。使用微調器過濾器列表視圖然後searchbox(edittext)
我用它的當前狀態(運行,停止,...)的Android微調
然後過濾車,我在搜索框中(使用editetext)型微調器旁邊汽車的名稱。它應該在Spinner中選擇狀態來過濾汽車。
我知道如何分開做,但不能在一起。我怎樣才能將微調濾鏡和搜索濾鏡結合在一起?真的很感謝幫助!
CarlistFragment1CarListFragment2
車(模型)創建一個列表視圖時,我有setter和getter方法爲正常。
CarAdapter代碼:
//This car list adapter class provides data to list view
public class CarListAdapter extends BaseAdapter implements Filterable{
private Context context;
private LayoutInflater inflater;
private List<Car> carList; // Original Data
private List<Car> carListSpinnerFiltered; // spinner filtered data
//private List<Car> carListSearchFiltered; // search filtered data
private ValueFilter valueFilter;
private ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public CarListAdapter(Context context, List<Car> carList) {
this.context = context;
this.carList = carList;
this.carListSpinnerFiltered = carList;
//this.carListSearchFiltered = carList;
}
@Override
public int getCount() {
return carList.size();
}
@Override
public Object getItem(int position) {
return carList.get(position);
}
@Override
public long getItemId(int position) {
// return position;
return carList.indexOf(getItem(position));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.list_row_carlist, null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
NetworkImageView thumbNail = (NetworkImageView) convertView
.findViewById(R.id.car_image);
TextView devname = (TextView) convertView.findViewById(R.id.devname);
TextView location = (TextView) convertView.findViewById(R.id.location);
TextView status = (TextView) convertView.findViewById(R.id.status);
TextView speed = (TextView) convertView.findViewById(R.id.speed);
// getting vehicle data for the row
final Car c = carList.get(position);
// thumbnail image
// thumbNail.setImageUrl(c.getImageURL(), imageLoader);
// device name
devname.setText(c.getDevname());
// location
if (c.getLocation().equals("")) {
location.setText(String.valueOf("Location unknown"));
} else {
location.setText(String.valueOf(c.getLocation()));
}
// status
switch (c.getStatus()) {
case "run":
status.setText(String.valueOf(statusRun));
status.setTextColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorCarRun));
break;
case "stop":
status.setText(String.valueOf(statusStop));
status.setTextColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorCarStop));
break;
case "lost_gprs":
status.setText(String.valueOf(statusLostGprs));
status.setTextColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorBlack));
break;
case "lost_gps":
status.setText(String.valueOf(statusLostGps));
status.setTextColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorffbf00));
break;
case "expired":
status.setText(String.valueOf("Expired"));
status.setTextColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorBlue));
break;
}
// speed
speed.setText(String.valueOf(c.getSpeed()));
return convertView;
}
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
// Search Field
// if (constraint != null && constraint.length() > 0) {
// ArrayList<Car> filterList = new ArrayList<>();
//
// for (int i = 0; i < carListSearchFiltered.size(); i++) {
//
// String devname = carListSearchFiltered.get(i).getDevname().toUpperCase();
// String inputString = constraint.toString().toUpperCase();
//
// if (devname.contains(inputString)) {
// Car car = new Car();
// car.setDevname(carListSearchFiltered.get(i).getDevname());
// car.setLocation(carListSearchFiltered.get(i).getLocation());
// car.setStatus(carListSearchFiltered.get(i).getStatus());
// car.setSpeed(carListSearchFiltered.get(i).getSpeed());
// car.setDevid(carListSearchFiltered.get(i).getDevid());
// filterList.add(car);
// }
//
//
// } // end for loop
//
// results.count = filterList.size();
// results.values = filterList;
//
// } else {
// results.count = carListSearchFiltered.size();
// results.values = carListSearchFiltered;
// }
// Spinner Filter
String inputStatus = constraint.toString();
if (!inputStatus.equals("All")) {
ArrayList<Car> spinnerList = new ArrayList<>();
for (int i = 0; i < carListSpinnerFiltered.size(); i++){
String carStatus = carListSpinnerFiltered.get(i).getStatus();
switch (carStatus){
case "run":
carStatus = "run";
break;
case "stop":
carStatus = "stop";
break;
case "lost_gprs":
carStatus = "lost_gprs";
break;
case "lost_gps":
carStatus = "lost_gps";
break;
default:
Toast.makeText(context, "status unknown", Toast.LENGTH_SHORT).show();
break;
} // end switch
if (carStatus.equals(inputStatus)) {
Car car = new Car();
car.setDevname(carListSpinnerFiltered.get(i).getDevname());
car.setLocation(carListSpinnerFiltered.get(i).getLocation());
car.setStatus(carListSpinnerFiltered.get(i).getStatus());
car.setSpeed(carListSpinnerFiltered.get(i).getSpeed());
car.setDevid(carListSpinnerFiltered.get(i).getDevid());
spinnerList.add(car);
}
} // end for loop
results.count = spinnerList.size();
results.values = spinnerList;
} else {
results.count = carListSpinnerFiltered.size();
results.values = carListSpinnerFiltered;
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
carList = (List<Car>) results.values;
notifyDataSetChanged();
}
} // end class
}
謝謝你的評論,但我還是不太瞭解它。我無法同時實現兩個過濾器。微調器將顯示當前所選狀態的所有汽車。只有這樣用戶纔想要在微調器結果中過濾特定的汽車。執行過濾器()只有一個約束。我怎樣才能過濾listview與多個約束分開?這很難。我無法解決這個人! –
我在代碼中充實了我的想法,這有幫助嗎?你能解釋一下你不明白的部分嗎? – Xiao
我仍在嘗試 –