列表视图清除搜索后没有返回到原来的状态 [英] List view not returning to original state after clearing search

查看:104
本文介绍了列表视图清除搜索后没有返回到原来的状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让我的名单再次显示我的所有项目,每当我取消从我的搜索视图搜索,但一些奇怪的原因,该列表被卡住的结果只能从previous搜索。有谁知道什么是错我的code和如何解决这一问题?我相信事情是错误的过滤器相关的code,但我不知道它是什么。

I'm trying to get my list to show all my items again whenever I cancel a search from my search view but for some strange reason, the list gets stuck with the results only from the previous search. Does anyone know what is wrong with my code and how to fix this? I believe something is wrong with the filter related code but I don't know what it is.

FilterListFragment.java

public class ItemListAdapter extends BaseAdapter implements Filterable {

    private List<Victoria> mData;
    private List<Victoria> mFilteredData;
    private LayoutInflater mInflater;
    private ItemFilter mFilter;

    public ItemListAdapter (List<Victoria> data, Context context) {
        mData = data;
        mFilteredData = data;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public String getItem(int position) {
        return mFilteredData.get(position).getItem();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        ViewHolder holder;
        if (convertView == null) {
           convertView = mInflater.inflate(R.layout.item_row, parent, false);
            holder = new ViewHolder();

            holder.title = (TextView) convertView.findViewById(R.id.item_title);
            holder.description = (TextView) convertView.findViewById(R.id.item_description);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.title.setText(mData.get(position).getItem());
        holder.description.setText(mData.get(position).getItemDescription());

        return convertView;
    }

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

    /**
     * View holder
     */
    static class ViewHolder {
        private TextView title;
        private TextView description;
    }

    /**
     * Filter for filtering list items
     */
    private class ItemFilter extends Filter {

        /**
         * Invoked on a background thread.  This is where all the filter logic should go
         * @param constraint the constraint to filter on
         * @return the resulting list after applying the constraint
         */
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (TextUtils.isEmpty(constraint)) {
                results.count = mData.size();
                results.values = mData;
            } else {
                //Create a new list to filter on
                List<Victoria> resultList = new ArrayList<Victoria>();
                for (Victoria str : mData) {
                    if (str.getItem().toLowerCase().contains(constraint.toString().toLowerCase())) {
                        resultList.add(str);
                    }
                }
                results.count = resultList.size();
                results.values = resultList;
            }
            return results;
        }

        /**
         * Runs on ui thread
         * @param constraint the constraint used for the result
         * @param results the results to display
         */
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            if (results.count == 0) {
                notifyDataSetInvalidated();
            } else {
                mFilteredData = (ArrayList<Victoria>)results.values;
                notifyDataSetChanged();
            }
        }
    }
}

列表处于正常状态

List in normal state

列表中的过滤状态

List in filtered state

推荐答案

您在原始数据,而不是过滤数据进行操作。应该维持一个参考原始数据,并使用经滤波的数据的所有其它目的。这样,当搜索被清零,显示原来的数据。

You are operating on the original data instead of filtered data. You should maintain a reference to original data and use the filtered data for all other purposes. So that the original data is displayed when search is cleared.

替换 MDATA的所有用途 mFilteredData 如下,只用原始数据生成过滤后的数据:

Replace all usages of mData with mFilteredData as below and only use the original data to generate the filtered data:

private List<String> mData;
private List<String> mFilteredData;
private LayoutInflater mInflater;
private ItemFilter mFilter;

public ItemListAdapter (List<String> data, Context context) {
    mData = data;
    mFilteredData = data;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

@Override
public String getItem(int position) {
    return mFilteredData.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

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

    String strItem = mFilteredData.get(position);
    ViewHolder holder;
    if (convertView == null) {
       convertView = mInflater.inflate(R.layout.item_row, parent, false);

        holder = new ViewHolder();
        holder.mTvItem = (TextView) convertView.findViewById(R.id.tv_item);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.mTvItem.setText(strItem);

    return convertView;
}

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

/**
 * View holder
 */
static class ViewHolder {
    private TextView mTvItem;
}

/**
 * Filter for filtering list items
 */
private class ItemFilter extends Filter {

    /**
     * Invoked on a background thread.  This is where all the filter logic should go
     * @param constraint the constraint to filter on
     * @return the resulting list after applying the constraint
     */
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults results = new FilterResults();

        if (TextUtils.isEmpty(constraint)) {
            results.count = mData.size();
            results.values = mData;
        } else {
            //Create a new list to filter on
            List<String> resultList = new ArrayList<>();
            for (String str : mData) {
                if (str.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    resultList.add(str);
                }
            }
            results.count = resultList.size();
            results.values = resultList;
        }
        return results;
    }

    /**
     * Runs on ui thread
     * @param constraint the constraint used for the result
     * @param results the results to display
     */
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        if (results.count == 0) {
            notifyDataSetInvalidated();
        } else {
            mFilteredData = (ArrayList<String>)results.values;
            notifyDataSetChanged();
        }
    }
}

这篇关于列表视图清除搜索后没有返回到原来的状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆