【问题标题】:Listview Filter - Cannot filter listview when backspace列表视图过滤器 - 退格时无法过滤列表视图
【发布时间】:2017-06-26 00:01:32
【问题描述】:

我在过滤器列表视图中遇到了一些问题,例如,当退格过滤器、列表视图未更新以及 val 搜索为空时,在这种情况下 Listview 未显示。这是我的代码:

public class ListDataFriendsAdapter extends ArrayAdapter<ListDataFriends> implements View.OnClickListener {
  private List<ListDataFriends> FilterData = new ArrayList<>();
private List<ListDataFriends> OriginalData = new ArrayList<>();
Activity activity;

ListDataFriendssFilter mListDataFriendssFilter;

public ListDataFriendsAdapter(Activity activity, List<ListDataFriends> data) {
    super(activity, android.R.layout.simple_list_item_1, data);
    this.OriginalData = data;
    this.FilterData = data;
    this.activity = activity;

}


@Override
public View getView(int position, View view, ViewGroup parent) {
    ListDataFriends friends = getItem(position);
    ViewHolder holder;
    if (view != null) {
        holder = (ViewHolder) view.getTag();
    } else {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        view = inflater.inflate(R.layout.item_sugest_friends, parent, false);
        holder = new ViewHolder(view);
        view.setTag(holder);
    }

    holder.fullName.setText(!TextUtils.isNullOrEmpty(friends.getFullName()) ? friends.getFullName() : "-");
    holder.email.setText(!TextUtils.isNullOrEmpty(friends.getEmailAddress()) ? friends.getEmailAddress() : "-");
    holder.phoneNumber.setText(!TextUtils.isNullOrEmpty(friends.getMobileNumber()) ? friends.getMobileNumber() : "-");

    return view;
}


class ViewHolder {
    @BindView(R.id.photo)
    AvatarView photo;
    @BindView(R.id.full_name)
    RobotoBoldTextView fullName;
    @BindView(R.id.email)
    RobotoRegularTextView email;
    @BindView(R.id.phone_number)
    RobotoRegularTextView phoneNumber;

    ViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}


@Override
public Filter getFilter() {
    if (mListDataFriendssFilter == null)
        mListDataFriendssFilter = new ListDataFriendssFilter();

    return mListDataFriendssFilter;
}

// Filter

private class ListDataFriendssFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<ListDataFriends> filteredItems = new ArrayList<ListDataFriends>();

            for (int i = 0, l = OriginalData.size(); i < l; i++) {
                ListDataFriends country = OriginalData.get(i);
                if (country.getFullName().toLowerCase().contains(constraint))
                    filteredItems.add(country);
            }
            result.count = filteredItems.size();
            result.values = filteredItems;
        } else {
            synchronized (this) {
                result.values = OriginalData;
                result.count = OriginalData.size();
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {

        FilterData = (ArrayList<ListDataFriends>) results.values;
        notifyDataSetChanged();
        clear();
        for (int i = 0, l = FilterData.size(); i < l; i++)
            add(FilterData.get(i));
        notifyDataSetInvalidated();
    }


}

那么如何解决呢?对不起我的英语

【问题讨论】:

    标签: android listview


    【解决方案1】:

    试试这个解决方案,

    进行如下所述的更改,

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
    
            constraint = constraint.toString().toLowerCase().trim();
            FilterResults result = new FilterResults();
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<ListDataFriends> filteredItems = new ArrayList<ListDataFriends>();
    
                for (int i = 0, l = OriginalData.size(); i < l; i++) {
                    ListDataFriends country = OriginalData.get(i);
                    if (country.getFullName().toLowerCase().contains(constraint))
                        filteredItems.add(country);
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            } else {
                synchronized (this) {
                    result.values = OriginalData;
                    result.count = OriginalData.size();
                }
            }
            return result;
        }
    

    关键变化是添加 .trim()

                constraint = constraint.toString().toLowerCase().trim();
    

    【讨论】:

    • 尝试删除同步的(这个)
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多