Java 库不显示更新的数据集

Java 库不显示更新的数据集,java,android,android-gallery,android-adapter,Java,Android,Android Gallery,Android Adapter,我有一个在一组图像中搜索的活动。这些图像显示在图库中。有一个编辑文本,用户可以在其中输入搜索词。当用户在EditText中输入文本时,库将根据输入的文本进行过滤 我制作了一个SearchResultAdapter-extensedbaseadapter-implements-Filterable,基本正常。如果用户输入文本,则会过滤适配器中的数据。我把结果记录了下来:到目前为止效果不错。然后我调用notifyAdapterSetChanged,以便库显示更新的数据集。实际调用了notifyAda

我有一个在一组图像中搜索的活动。这些图像显示在图库中。有一个编辑文本,用户可以在其中输入搜索词。当用户在EditText中输入文本时,库将根据输入的文本进行过滤

我制作了一个
SearchResultAdapter-extensedbaseadapter-implements-Filterable
,基本正常。如果用户输入文本,则会过滤适配器中的数据。我把结果记录了下来:到目前为止效果不错。然后我调用notifyAdapterSetChanged,以便库显示更新的数据集。实际调用了notifyAdapterSetChanged,并且库在调用我的适配器getCount()时收到了请求(我记录了所有调用)

由于IndexOutOfBoundsException,将选择设置为0会使应用程序崩溃,正如我在库中没有项目时所期望的那样。画廊仍然展示了所有以前的图片

问题是: 当数据集为空(即用户输入的搜索词不适合任何图像)时,图库不会显示更新。gallery接收notifyAdapterSetChanged,查询适配器的项目计数(为0)并更新滚动限制。它不会更新库中显示的图像。我不能再滚动图像了,因为基本上没有图像可显示,但图像不会从库中删除。在用户看来,画廊似乎冻结了

删除无效搜索词(即数据集不为空)后,多媒体资料将显示正确的图像。此外,在某些情况下,库会显示空列表,如应用程序最小化然后重新打开时。但是,我无法再现库自身清空的条件(除了最小化/重新打开应用程序外):

我尝试过使库无效并请求layout(),但没有帮助。有人知道我如何让画廊更新显示的图像列表吗

此处显示用户输入不匹配图像的文本时的日志消息:

[SearchResultAdapter.SearchFilter] Results: 0
[SearchResultAdapter.SearchFilter] called notifyDataSetChanged()
[SearchResultAdapter.getCount()] getCount called: dateset size 0
[SearchResultAdapter.getCount()] getCount called: dateset size 0
请注意gallery在数据集大小上实际上是如何调用适配器的

活动中的初始化代码:

final Gallery gallery = (Gallery) findViewById(R.id.search_results);
final SearchResultAdapter adapter = new SearchResultAdapter(this, gallery);
gallery.setAdapter(adapter);
EditText searchField = (EditText) findViewById(R.id.search_searchfield);
searchField.addTextChangedListener(new TextWatcher()
{
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count)
    {
        // TODO unhardcode criterion
        adapter.putFilterTerm(SearchCriteria.OFFERING, s.toString());
        adapter.getFilter().filter(s);
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {
        // do nothing
    }

    @Override
        public void afterTextChanged(Editable s)
    {
        // do nothing
    }
});
和SearchResultAdapter(不重要的行被省略):


有更好的解决办法吗?这对我来说似乎有点骇人听闻。

Plz,请将示例代码上传到某个地方。您确定调用了
publishResults()
?您是否尝试执行以下操作:currentList.removeAll();currentList.addAll(结果);相反,我确信在我记录publishResults()时会调用它。日志代码不在上面的清单中。我刚刚尝试了currentList.clear()和currentList.addAll(…),但都不起作用。我使用了上次编辑中的解决方案
public class SearchResultAdapter extends BaseAdapter implements Filterable
{

    private Context context;
    private Filter filter;

    public void putFilterTerm(SearchCriteria key, String value)
    {
        filterTerms.put(key, value);

    }

    public boolean containsFilterTerm(SearchCriteria key)
    {
        return filterTerms.containsKey(key);

    }

    public String getFilterTerm(SearchCriteria key)
    {
        return filterTerms.get(key);
    }

    List<PageContainer> completeList = new ArrayList<PageContainer>();
    List<PageContainer> currentList = new ArrayList<PageContainer>();
    Map<SearchCriteria, String> filterTerms = new HashMap<SearchCriteria, String>();
    View view;

    public SearchResultAdapter(Context context, View gallery)
    {
        this.context = context;
        this.view = gallery;
        for (ContentPropertyContainer page : Model.getInstance()
                    .getRootContainer().getChildren())
        {
            completeList.add((PageContainer) page);
        }
        currentList.addAll(completeList);
    }

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

    @Override
    public Object getItem(int position)
    {
        return currentList.get(position);

    }

    @Override
    public long getItemId(int position)
    {
        PageContainer item = currentList.get(position);
        for (int i = 0; i < completeList.size(); ++i)
        {
            if (completeList.get(i) == item)
            {
                return i;
            }
        }

        return -1;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View listview = convertView;

        // Code left out here tries to reuse the convertView
        // like Romain Guy said in a Google I/O Talk

        return listview;
    }

    private class ResultList
    {
        ResultList(List<PageContainer> results)
        {
            this.results = results;
        }

        List<PageContainer> results;
    }

    @Override
    public Filter getFilter()
    {
        // implements Filterable
        if (filter == null)
        {
            filter = new SearchFilter();
        }

        return filter;
    }

    private class SearchFilter extends Filter
    {
        SearchFilter()
        {
            // do nothing, needed for visibility
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {
            FilterResults results = new FilterResults();

            // Code left out here filters the list

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results)
        {
            if (results == null)
            {
                return;
            }

            if (results.values instanceof ResultList)
            {
                currentList = ((ResultList) (results.values)).results;
                notifyDataSetChanged();
            }
        }
    }
}
view.post(new Runnable()
{
    @Override
    public void run()
    {
        view.setVisibility(View.INVISIBLE);
        view.setVisibility(View.VISIBLE);
    }
});