【问题标题】:Filter fragment adapter from action bar从操作栏中过滤片段适配器
【发布时间】:2013-07-05 16:41:59
【问题描述】:

已编辑...

我正在尝试从搜索视图中过滤适配器。我知道我所拥有的很接近,但并不完全在那里。我收到此错误消息,代码如下。

LogCat

W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40f0f2a0)
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at ---$FreeAgentPagerAdapter.getCount(---.java:403)
    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:813)
    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2688)
    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
    at ---$FreeAgentPagerAdapter$1.publishResults(---.java:434)

搜索视图

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.in_game, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) searchItem.getActionView();
    setupSearchView(searchItem);

    if (mState == 0) {
        menu.findItem(R.id.action_search).setVisible(false);
    }

    return true;
}

private void setupSearchView(MenuItem searchItem) {

    if (isAlwaysExpanded()) {
        mSearchView.setIconifiedByDefault(false);
    } else {
        searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    }

    mSearchView.setOnQueryTextListener(this);
}

String newText = "";
public boolean onQueryTextChange(String newText) {
    Toast.makeText(getBaseContext(), "Query = " + newText, Toast.LENGTH_SHORT).show();
    return false;
}

public boolean onQueryTextSubmit(String query) {
    Adapter.getFilter().filter(newText.toString());
    return false;
}

protected boolean isAlwaysExpanded() {
    return false;
}

适配器

public class AdapterFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment, container, false);
        ViewPager = (ViewPager) rootView.findViewById(R.id.Pager);
        Adapter = new PagerAdapter(getChildFragmentManager());
        ViewPager.setAdapter(Adapter);
        return rootView;
    }
}

public class PagerAdapter extends FragmentStatePagerAdapter {

    private List TITLES = new ArrayList();

    private Map ReferenceMap;

    public PagerAdapter(FragmentManager fm) {
        super(fm);

        ReferenceMap = new HashMap();

        TEST.add("TESTING");
        for (Test test : test.getTest()) {
            TEST.add(test.getTest());
        }
    }

    @Override
    public CharSequence getTitle(int i) {
        return TEST.get(i);
    }

    @Override
    public int getCount() {
        return TEST.size();
    }

    @Override
    public Fragment getItem(int i) {
        Fragment Fragment = Fragment.newInstance(test.getId(), TEST.get(i));
        ReferenceMap.put(i, (Fragment) Fragment);
        return Fragment;
    }

    public FiltaddDropFragmentlter() {
        return new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                Toast. makeText(getBaseContext(), "Publishing " + constraint, Toast.LENGTH_LONG).show();
                TEST = (List<String>) results.values;
                Adapter.notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                Toast.makeText(getBaseContext(), "Filtering " + constraint, Toast.LENGTH_LONG).show();
                List<String> filteredResults = getFilteredResults(constraint);

                FilterResults results = new FilterResults();
                results.values = filteredResults;

                return results;
            }
        };
    }

}

private List<String> getFilteredResults(CharSequence constraint) {
    return null;
}

谁能指出我做错了什么?我想我只需要第二双眼睛来看看这个。我应该做些什么不同的事情,我怎样才能以最好的方式做到这一点?

【问题讨论】:

  • 不清楚您要过滤的内容。
  • 我正在尝试使用搜索视图中的关键字过滤 mAddDropAdapter。代码有什么不清楚的地方?
  • 我错过了那部分。在performFiltering() 方法中,您使用getFilteredResults(constraint); 方法获取过滤后的值,但您已将其设置为始终返回null。在那里,您需要遍历 TITLES 列表并查看哪个与约束匹配(并将这些条目添加到结果列表并返回它而不是 null)。此外,Filter 类并不是必需的,它会在过滤 AdapterView 的适配器时使用。在您的情况下,您可以通过简单的方法进行过滤。

标签: java android filter adapter searchview


【解决方案1】:

三个步骤:

  1. 创建一个扩展Filter 的新类(或者可能是适配器中的静态内部类)。实现performFiltering() 方法。
  2. 实现publishResults() 方法来交换您的列表数据并在您的适配器上调用notifyDataSetChanged()
  3. 让你的适配器实现Filterable接口并定义getFilter()方法。它应该返回您在第 1 步中创建的新过滤器类的实例。

performFiltering 将在后台线程中处理,publishResults 将从 UI 线程中调用。

我正在寻找帮助我学习列表过滤的示例代码。如果我找到它,我会发布一个链接。

【讨论】:

  • 感谢您的逐步指导。如果您能发布链接,我将不胜感激。
  • 这不是我之前找到的那个,但这里有一个例子:survivingwithandroid.com/2012/10/…
  • 您介意再看一下我的问题吗?我更新了。
  • 如果TITLESnull,您的getCount() 实现将不起作用。将其更改为 return (TITLES != null) ? TITLES.size(): 0; 或确保您的过滤器始终交换为非空列表(它可以是空列表)。
  • 好的。它现在正在工作。您知道使过滤器不区分大小写的最佳方法吗?有些字词是大写的,除非您的关键字完全匹配,否则不会显示在结果中。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多