如何在使用自定义listview的edittext过滤器中获得空间?使用简单的适配器可以吗?

问题描述:

我有自定义listview使用简单的适配器,目前我有关于过滤器的问题,我有列表视图中的数字和字符的自定义列表数据。如何在使用自定义listview的edittext过滤器中获得空间?使用简单的适配器可以吗?

如果我输入名称,那么它给一个空格的过滤结果会消失。

我有列表数据,如名称然后数字例如:名称123,每当我输入名称,然后给出该编辑文本中的空间,然后结果消失,列表视图将消失。

我在下面的链接上试过这个,但是他们使用了数组适配器,所以我的问题是只能在数组适配器中使用,或者我可以使用简单的适配器?

如果是的话,我怎么能实现,好心帮。提前谢谢你。

+0

offcourse有可能在一个适配器,发布您的代码你怎么比较值? –

尝试这种方式

searchView.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
@Override 
public boolean onEditorAction(TextView v, int actionId, 
           KeyEvent event) { 
    return true; 
} 
}); 
addTextChangeListener(); 

现在创建方法addTextChangeListener

private void addTextChangeListener() { 
searchView.addTextChangedListener(new TextWatcher() { 
@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

} 

@Override 
public void onTextChanged(CharSequence query, int start, int before, int count) { 

    query = query.toString().trim().toLowerCase(); 

    final ArrayList<CityDataModel> filteredList = new ArrayList<>(); 



    final CharSequence finalQuery = query; 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      // Clear the filter list 
      filteredList.clear(); 

      // If there is no search value, then add all original list items to filter list 
      if (TextUtils.isEmpty(finalQuery)) { 

       filteredList.addAll(cities); 

      } else { 
       // Iterate in the original List and add it to filter list... 
       for (CityDataModel item : cities) { 
        if (item.getCity_name().toLowerCase().contains(finalQuery.toString().toLowerCase()) 
          ) { 
         // Adding Matched items 
         filteredList.add(item); 
        } 
       } 
      } 

      // Set on UI Thread 
      ((Activity) context).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        // Notify the List that the DataSet has changed... 
        adapter = new SearchCityAdapter(SearchCityClass.this, filteredList); 
        recyclerSearchCity.setAdapter(adapter); 
       } 
      }); 

     } 
    }).start(); 


} 

@Override 
public void afterTextChanged(Editable s) { 

} 
}); 
    } 

你可以使用任何适配器,你可以只用android.widget.Filterable

实现适配器

例适配器,

public class AppAdapter extends RecyclerView.Adapter<AppHolder> implements Filterable { 

    public static final String TAG = AppAdapter.class.getSimpleName(); 

    private ArrayList<App> mApps = new ArrayList<>(); 

    private List<App> mCurrentItmCopy = new ArrayList<>(); 

    private String currentFilter; 

    private MyArrayFilter mFilter; 

    @Override 
    public AppHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View receiverView = LayoutInflater.from(parent.getContext()). 
       inflate(R.layout.layout_row_apps, parent, false); 


     return new AppHolder(receiverView); 
    } 

    @Override 
    public void onBindViewHolder(final AppHolder holder, int position) { 
     final App data = mApps.get(position); 

    } 

    @Override 
    public int getItemCount() { 
     return mApps.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new MyArrayFilter(); 
     } 
     return mFilter; 
    } 


    private class MyArrayFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 

      FilterResults results = new FilterResults(); 

      if (mCurrentItmCopy == null || (mCurrentItmCopy.size() == 0)) { 
       mCurrentItmCopy = new ArrayList<App>(mApps); 
      } 

      ArrayList<App> newValues = new ArrayList<App>(); 
      if (prefix != null && !TextUtils.isEmpty(prefix.toString())) { 
       String prefixString = prefix.toString().toLowerCase(); 
       for (App value : mCurrentItmCopy) { 
        String label = value.getLabel().toLowerCase(); 

        if ((label.contains(prefixString)) && !newValues.contains(value)) { 
         newValues.add(value); 
        } 
       } 
       results.values = newValues; 
       results.count = newValues.size(); 
      } else { 
       results.values = new ArrayList<App>(mCurrentItmCopy); 
       results.count = mCurrentItmCopy.size(); 

       mCurrentItmCopy.clear(); 
      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      currentFilter = constraint.toString(); 

      if (results.count > 0) { 
       mApps.clear(); 

       addAll((ArrayList<App>) results.values); 

      } else { 

       mApps.clear(); 
       notifyDataSetChanged(); 
      } 
     } 
    } 

    public void addAll(List<App> items) { 

     if (items != null) { 
      mApps.addAll(items); 
     } 

     notifyDataSetChanged(); 
    } 

} 

在上面的Adapter而不是App中,您可以使用您的对象。

您可以从活动或片段是这样叫,

mAdapter.getFilter().filter(newText);