2016-09-09 9 views
0

オブジェクトのArrayAdapterのカスタムリストにフィルタを適用しました。私はフィルター処理を適用しており、初めてのみ作業しています。フィルタリングされたテキストを削除して別のテキストを入力しようとすると、ListViewで更新されたデータが表示されません。ここではそれのための私のコード、ArrayAdapterフィルタリングは、初めて初めて動作します。次の入力で失敗しました

アダプタクラス}

のEditText TextWatcherコード

public class ServiceListAdapter extends ArrayAdapter<ServiceItem> implements Filterable { 

private Context mContext; 
private List<ServiceItem> serviceItemList; 
private List<ServiceItem> nameList; 
private LayoutInflater inflater; 
private int layoutId; 
private ServiceFilter filter; 


public ServiceListAdapter(Context context, int resource, List<ServiceItem> serviceItemList) { 
    super(context, resource, serviceItemList); 

    this.mContext = context; 
    this.serviceItemList = serviceItemList; 
    this.layoutId = resource; 
    this.inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View v = convertView; 
    ServiceHolder sHolder = null; 

    if (v == null) { 

     v = inflater.inflate(layoutId, null); 

     sHolder = new ServiceHolder(); 
     sHolder.serviceName = (TextView) v.findViewById(R.id.serviceName); 
     sHolder.serviceDetail = (TextView) v.findViewById(R.id.serviceDetail); 
     sHolder.serviceImg = (ImageView) v.findViewById(R.id.serviceImg); 
     sHolder.btnGo = (Button) v.findViewById(R.id.btnGo); 

     v.setTag(sHolder); 
    } else { 

     sHolder = (ServiceHolder) convertView.getTag(); 
    } 

    ServiceItem serviceItem = getItem(position); 
    sHolder.serviceName.setText(serviceItem.getServiceName()); 
    sHolder.serviceDetail.setText(serviceItem.getServiceDetail()); 
    sHolder.serviceImg.setImageResource(serviceItem.getServiceImg()); 

    sHolder.btnGo.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


     } 
    }); 


    return v; 
} 

static class ServiceHolder { 

    TextView serviceName; 
    TextView serviceDetail; 
    ImageView serviceImg; 
    Button btnGo; 

} 

@Override 
public ServiceItem getItem(int position) { 
    return serviceItemList.get(position); 
} 

@Override 
public Filter getFilter() { 

    if (filter == null) { 
     filter = new ServiceFilter(); 
    } 
    return filter; 

} 

private class ServiceFilter extends Filter { 


    private static final String TAG = "Filter"; 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 


     FilterResults filterResults = new FilterResults(); 


     Log.d(TAG, "Length: " + constraint.toString().length()); 

     if (constraint != "" && constraint.toString().length() > 0) { 

      ArrayList<ServiceItem> filterItems = new ArrayList<>(); 
      ArrayList<ServiceItem> sItems = new ArrayList<>(); 

      synchronized (this) 
      { 
       sItems.addAll(serviceItemList); 
      } 

      constraint = constraint.toString().toLowerCase(); 

      Log.d(TAG, "To Compare:: " + constraint); 

      for (int l = 0; l< sItems.size(); l++) { 

       Log.d(TAG, "sItems Size:" + sItems.size()); 

       ServiceItem sItem = sItems.get(l); 
       String name = sItem.toString(); 
       Log.d(TAG, "Name: " + name); 

       if (name.startsWith(constraint.toString().toLowerCase())){ 
        Log.d(TAG, "Added: " + name); 
        filterItems.add(sItem); 
       } 

      } 
      Log.d(TAG, "Filter Item Size: " + filterItems.size()); 

      filterResults.count = filterItems.size(); 
      filterResults.values = filterItems; 

     } else { 

      synchronized (this) { 

       Log.d(TAG, "performFiltering: ORIGINAL "); 
       Log.d(TAG, "Filter Item Size: " + serviceItemList.size()); 

       filterResults.values = serviceItemList; 
       filterResults.count = serviceItemList.size(); 

      } 
     } 

     Log.d(TAG, "Count:" + filterResults.count); 

     return filterResults; 
    } 


    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     /*nameList is List<ServiceItem> declared in root class*/ 

     nameList = (ArrayList<ServiceItem>) results.values; 

     notifyDataSetChanged(); 
     clear(); 
     for(int i = 0, l = nameList.size(); i < l; i++) 
      add(nameList.get(i)); 
     notifyDataSetInvalidated(); 
    } 
} 

です:だから

edtFilterText.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("Filter", "beforeTextChanged: " +s); 
      serviceListAdapter.getFilter().filter(s.toString().toLowerCase()); 
     } 
    }); 

、私はろ過の結果を得た唯一初めて。その後、editTextコンテンツを変更しようとすると、フィルタ項目に結果が表示されず、メインserviceItemsのリストサイズが項目なしでゼロに表示されます。

私はすでに多くの回答を試みてきましたが、私の結果はこのように動作します。あなたのために

答えて

0

種類私はそれが

// Filter Class public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); serviceItemList.clear(); if (charText.length() == 0) { serviceItemList.addAll(nameList); } else { for (ServiceItem si : nameList) { if (si.getServiceName().toLowerCase(Locale.getDefault()).contains(charText)) { serviceItemList.add(si); } } } notifyDataSetChanged(); }

、呼び出し方法が

serviceListAdapter.filter(s.toString().toLowerCase()); 

とするために、ほんの少しの変更前のものと同じであると解いてしまった情報の詳細については、Filterクラスから実装する必要のあるメソッドではありません。チャームのように機能する手動の方法。

関連する問題