2017-10-16 13 views
0

車の名前、車の詳細などのリストビューがあります。私はその名前で車を探しています。スピナーでリストビューをフィルタリングした後、検索ボックス(edittext)

  1. 私はその現在の状態(...、停止、実行)を使用して、Androidのスピナーその後

  2. で車をフィルタリングし、私は次のスピナーに(editetextを使用して)、検索ボックスに入力し、車の名。 Spinnerでステータスを選択して車をフィルタリングする必要があります。

私はそれらを別々に行う方法を知っていますが、一緒には使用できません。スピナーフィルターと検索フィルターを組み合わせるにはどうすればよいですか?本当に助けに感謝!

CarlistFragment1CarListFragment2

カー(モデル)リストビューを作成するときに、私は通常通りセッターとゲッターメソッドがあります。

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 

} 

答えて

0

私が気づく最初の問題は、フィルタの結果と、carListに保存されている車のあなたの元のリストを、上書きしていることです。つまり、フィルタがクリアされると、復元できなくなります。あなたは、データの元のセット、そしてあなたが表示されますデータのための別のリストについては、1つのリストを続ければ

あなたはそれが簡単かもしれません。最初はこれらは同じになります。その後、performFilterで、あなたは完全なリストから望む車でディスプレイリストを作り直すことができます。

あなたの実際の質問に対しては、複数の制約タイプを扱うことができFilterクラスのようには見えません。それを使用するように設定されている場合は、performFilterが呼び出されるたびに、両方のタイプのフィルタリングを行うフィルタが必要になります。スピナーのステータスフィルタと検索ボックスのテキストフィルタの両方を取り込み、|のような特殊文字で結合する独自のメソッドをアダプタで作成できます。例:

lost_gps|mysearch

次にperformFilter()方法でそれらを分離。

もう一つのポイントは、ステータスが知られていない場合performFilterであなたのswitch文が効果的にちょうどトーストが表示されていることです。割り当てのどれも、それはあなたがステータス、またはステータスが既成HashSet対象にした、その後、あなただけSet.contains()を使用することができればさらに良いのそれぞれに対してテストif文で置き換えることができ、何もしません。

更新:

アダプタで、より多くのアイデアを肉付けするために、あなたのFilterクラスに続いて

class Adapter ... { 
    private String mStatusFilter = ""; 
    private String mSearchFilter = ""; 

    private void setStatusFilter(String statusFilter) { 
     mStatusFilter = statusFilter; 
     getFilter().filter(mStatusFilter + "|" + mSearchFilter); 
    } 

    private void setSearchFilter(String searchFilter) { 
     mSearchFilter = searchFilter; 
     getFilter().filter(mStatusFilter + "|" + mSearchFilter); 
    } 
} 

のようなものを持っているでしょう

performFiltering(CharSequence constraint) { 
    displayedCarList.clear(); 
    String statusFilter = constraint.split("|")[0] 
    String searchFilter = constraint.split("|")[1] 
    for(Car car: carList) { 
     // Does it match the status? (if filter not set, default to yes) 
     boolean statusMatch = TextUtils.isEmpty(statusFilter) || 
      car.status.equals(statusFilter); 
     // Does it match the name? (if filter not set, default to yes) 
     boolean searchMatch = TextUtils.isEmpty(searchFilter) || 
      car.name.contains(searchFilter); 
     if(statusMatch && searchMatch) { 
      displayedCarList.add(car) 
     } 
    } 
    ... 
} 

アダプタは、ちょうどすべてを表示していました車はdisplayedCarListです。

+0

あなたのコメントをありがとうが、私はまだそれほど多くのことを理解していません。私は両方のフィルターを同時に実装することはできません。スピナーは、現在選択されている状態のすべての車を表示することです。そのときだけ、ユーザーはスピナー結果内の特定の車をフィルターにかけたいと思う。問題は、performFilter()が1つの制約だけを取ることです。リストビューを複数の制約で別々にフィルタリングするにはどうすればよいですか?これはきつい。私はこの男を解決することはできません! –

+0

私のアイデアをコードで少し完成させましたが、それは助けになりますか?あなたは理解できない部分をもっと説明できますか? – Xiao

+0

私はまだ試しています –

関連する問題