如何在可过滤的ListView中显示“无结果”?

时间:2011-05-27 02:47:32

标签: android android-listview filtering android-edittext textwatcher

我有ListViewEditText。我在addTextChangedListener上实施EditText过滤 ListView内容。

leftList.setTextFilterEnabled(true);
et_search.addTextChangedListener(filterTextWatcher);

然后TextWatcher是:

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

         if (watcherAdapter==null) {
             return;
         }

         watcherAdapter.getFilter().filter(s);

         Log.e(TAG, "OnTextChange: " + s + " start: " + start +
         " before: " + before + " count: " + count + " adapter: " +
         watcherAdapter.getCount());    

    }
};

条件:

  1. 我在ListView中有10个项目。
  2. 问题:

    1. 当我第一次输入第一个字符时,watcherAdapter.getCount()为什么在10 w中返回ListVie(作为初始值)而不是返回的过滤结果计数?对于watcherAdapter.getCount(中显示的结果,ListView)似乎迟到了一次。
    2. 如果我在"No Result"上输入没有匹配结果,ListView中显示EditText的方式是什么?

5 个答案:

答案 0 :(得分:3)

将TextView添加到您的布局中,在列表上方或下方显示消息更清晰:

<TextView 
android:id="@+id/noResultsFoundView" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="No result"
android:visibility="gone"
/>

如果有结果,则将可见性设置为GONE。如果没有结果,则将其设置为VISIBLE。

要听取这个,您可以实现自定义过滤器或至少覆盖方法

publishResults(CharSequence constraint, FilterResults results)
来自Filter的

,其中在FilterResults参数中传递了正确的更新计数。

在publishResults中,您可以从活动中调用方法来更新noResultsFoundView的可见性。访问活动的方式取决于过滤器的位置。如果它在活动的内部类中,则很容易。否则,您可以将activity作为参数传递给实例化适配器,并将其存储为intance变量。

答案 1 :(得分:2)

当然可以在可过滤列表中显示没有结果。请参考以下代码

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.home, menu);

        MenuItem searchItem = menu.findItem(R.id.menu_search);
        final AppCompatEditText searchView = (AppCompatEditText) MenuItemCompat.getActionView(searchItem);
        if (searchView != null) {
            searchView.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
                    if(mAdapter==null)
                        return;
                        mAdapter.getFilter().filter(arg0.toString());
                        if(mAdapter.getItemCount()<1){
                            listView.setVisibility(View.GONE);
                            txtEmptyList.setVisibility(View.VISIBLE);
                        }else{
                            listView.setVisibility(View.VISIBLE);
                            txtEmptyList.setVisibility(View.GONE);
                        }
                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                                              int arg2, int arg3) {
                }

                @Override
                public void afterTextChanged(Editable arg0) {

                }
            });
        }
        MenuItemCompat.setOnActionExpandListener(searchItem, this);
        MenuItemCompat.setActionView(searchItem, searchView);
        super.onCreateOptionsMenu(menu, inflater);
    }

答案 2 :(得分:1)

if(!fillMaps.isEmpty())
            {
            SimpleAdapter adapter = new SimpleAdapter(
                    WorldClockActivity.this, fillMaps, R.layout.grid_item,
                    from, to);
            lv1.setAdapter(adapter);
            }
            else
            {      String[] emptyList = new String[] {"No record found"};
            lv1.setAdapter(new ArrayAdapter<String>(WorldClockActivity.this,R.layout.list_item, emptyList));
            }

你应该使用两个适配器在上面的代码中执行此操作我已经使用了两个适配器第一个设置当我们在地图中找到项目如果地图是空的那么你应该添加另一个适配器我把它放在其他条件.I已经做到了,运行正常。 我希望你能得到解决方案。

答案 3 :(得分:0)

我最后使用的唯一解决方案是执行我的自定义搜索过滤器....拆分单词,标记它们,如果匹配则将它作为适配器放在数组上。它按我的意愿运作

答案 4 :(得分:0)