如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?

Posted

技术标签:

【中文标题】如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?【英文标题】:how to get space in edittext filter using custom listview? does it possible using simple adapter? 【发布时间】:2017-11-22 17:33:07 【问题描述】:

我有使用简单适配器的自定义列表视图,目前我有关于过滤器的问题,我在列表视图中有带有数字和字符的自定义列表数据。

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

我有列表数据,例如名称然后编号,例如:NAME 123,每当我输入名称然后在该编辑文本中留出空间然后结果消失并且列表视图消失。

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

android listview edittext filter space button?

如果是,那么我该如何实施,请提供帮助。提前谢谢。

【问题讨论】:

当然可以在一个适配器中,发布您的代码您如何比较这些值? 【参考方案1】:

试试这个方法

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) 


 );
  

【讨论】:

【参考方案2】:

你可以使用任何适配器,你可以用 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);

【讨论】:

以上是关于如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个自定义列表的选定数据显示到同一活动的另一个自定义列表视图

如何在 BaseAdapter 中使用 getFilter() 过滤 ListView

Android listview edittext过滤空间按钮?

如何自动选择操作栏上的自定义视图(EditText)?

NullPointerException 自定义列表视图适配器

在自定义适配器中隐藏软键盘