2015-12-23 3 views
1

Я не могу найти ошибку - мне нужно отфильтровать список в соответствии с поиском. Но не работает. Вот кодAndroid - Listview не получает фильтрацию

EditText TextWatcher код: -

getEdit_myOrderSearch().addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      adapter.getFilter().filter(s); 
      Log.d("", "CharSequence : " + s); 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

Вот код адаптера: -

public class Adpater extends BaseAdapter implements Filterable { 

private Context mContext; 
private LayoutInflater inflater; 
private List<Order> orignailOrders; 
private List<Order> filterOrders; 

public Adpater(Context context, List<Order> orders) { 
    this.mContext = context; 
    this.orignailOrders = orders; 
    this.filterOrders = orders; 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 

    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.custom_myorder, parent, 
       false); 

     viewHolder.orderCode = (TextView) convertView 
       .findViewById(R.id.txt_custom_order_code); 
     viewHolder.orderTopic = (TextView) convertView 
       .findViewById(R.id.txt_custom_order_topic); 
     viewHolder.orderDate = (TextView) convertView 
       .findViewById(R.id.txt_custom_order_date); 
     viewHolder.orderStatus = (TextView) convertView 
       .findViewById(R.id.txt_custom_order_status); 

     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.orderCode 
      .setText(filterOrders.get(position).getOrder_code()); 
    viewHolder.orderTopic.setText(filterOrders.get(position).getTopic()); 
    viewHolder.orderDate.setText(formattedDate); 
    viewHolder.orderStatus.setText(filterOrders.get(position) 
      .getProject_status()); 

    return convertView; 
} 

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 

      filterOrders = (ArrayList<Order>) results.values; 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      ArrayList<Order> FilteredArrList = new ArrayList<Order>(); 

      if (orignailOrders == null) { 
       orignailOrders = new ArrayList<Order>(filterOrders); 
      } 

      if (constraint == null || constraint.length() == 0) { 


      } else { 
       constraint = constraint.toString().toLowerCase(); 
       for (int i = 0; i < orignailOrders.size(); i++) { 
        String data = orignailOrders.get(i).getId(); 
        if (data.toLowerCase() 
          .startsWith(constraint.toString())) { 
         FilteredArrList.add(new Order(orignailOrders.get(i) 
           .getOrder_code(), orignailOrders.get(i) 
           .getTopic(), orignailOrders.get(i) 
           .getDdate(), orignailOrders.get(i) 
           .getProject_status())); 
        } 
       } 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 
      return results; 
     } 
    }; 
    return filter; 
}} 

Неиспользованный код удален из адаптера.

Помогите пожалуйста и заблаговременно.

ответ

0

Редактировать адаптер код, вы пропустите две строки, т.е.

results.count = orignailOrders.size(); 
results.values = orignailOrders; 

Вот полный код адаптера просто заменить его.

public class Adpater extends BaseAdapter implements Filterable { 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.custom_myorder, parent, 
        false); 

      viewHolder.orderCode = (TextView) convertView 
        .findViewById(R.id.txt_custom_order_code); 
      viewHolder.orderTopic = (TextView) convertView 
        .findViewById(R.id.txt_custom_order_topic); 
      viewHolder.orderDate = (TextView) convertView 
        .findViewById(R.id.txt_custom_order_date); 
      viewHolder.orderStatus = (TextView) convertView 
        .findViewById(R.id.txt_custom_order_status); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.orderCode 
       .setText(filterOrders.get(position).getOrder_code()); 
     viewHolder.orderTopic.setText(filterOrders.get(position).getTopic()); 
     viewHolder.orderDate.setText(formattedDate); 
     viewHolder.orderStatus.setText(filterOrders.get(position) 
       .getProject_status()); 
     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
       filterOrders = (ArrayList<Order>) results.values; 
       notifyDataSetChanged(); 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults(); 
       ArrayList<Order> FilteredArrList = new ArrayList<Order>(); 

       if (orignailOrders == null) { 
        orignailOrders = new ArrayList<Order>(filterOrders); 
       } 

       if (constraint == null || constraint.length() == 0) { 
     result.count= orignalOrder.size(); 
     result.values=orignalOrders;// this line is missing 
     } else { 
        constraint = constraint.toString().toLowerCase(); 
        for (int i = 0; i < orignailOrders.size(); i++) { 
         String data = orignailOrders.get(i).getId(); 
         if (data.toLowerCase() 
           .startsWith(constraint.toString())) { 
          FilteredArrList.add(new Order(orignailOrders.get(i) 
            .getOrder_code(), orignailOrders.get(i) 
            .getTopic(), orignailOrders.get(i) 
            .getDdate(), orignailOrders.get(i) 
            .getProject_status())); 
         } 
        } 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
       return results; 
      } 
     }; 
     return filter; 
    } 
} 

Это поможет вам.

0

Это неправильный способ создания списка ListView для поиска, и я думаю, вам нужно еще много вещей, чтобы его получить.

Сначала вам нужно объявить новый фильтр для поиска в вашей деятельности в файле манифеста.

<activity 
     android:name=".Main" 
     android:configChanges="orientation|screenSize" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <action android:name="android.intent.action.SEARCH" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" > 
     </meta-data> 
    </activity> 

Затем вы должны определить ваш для поиска элемента в Рез/XML/searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="@string/app_name" 
android:hint="@string/search_hint" 
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"> 

И, наконец, вы должны обрабатывать все входящие searchables намерения в деятельности, которая содержит ваш listView

@Override 
protected void onResume() { 
    super.onResume(); 
    mQueryTask = new QueryRemoteUnits(); 
    mQueryTask.execute(); 
    handleIntent(getIntent()); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     executeSearch(query); 
    } else { 
     executeSearch(); 
    } 
} 

private void executeSearch() { 
    if (mSearchTask != null) { 
     mSearchTask.cancel(true); 
    } 

    if (mSearchView != null && !mSearchView.isIconified()) { 
     String query = mSearchView.getQuery().toString(); 
     mSearchTask = new SearchRemoteUnits(query); 
    } else { 
     mSearchTask = new SearchRemoteUnits(); 
    } 
    mSearchTask.execute(); 
} 

private void executeSearch(String namePattern) { 
    if (mSearchTask != null) { 
     mSearchTask.cancel(true); 
    } 
    mSearchTask = new SearchRemoteUnits(namePattern); 
    mSearchTask.execute(); 
} 

На нижеследующей ссылке у вас есть подробное описание iption о том, как создать интерфейс с возможностью поиска.

Creating a Search Interface

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