列表中的过滤器无法正常工作

时间:2016-03-26 21:52:01

标签: java android android-studio

我遇到以下代码的麻烦。我试图过滤ListView。内容是从Firebase下载的,但这不应该是问题的根源。我希望在用户写入时更新列表的内容。它实际上有效,但问题是当用户删除一个字符时:该列表仅使用先前研究的结果进行更新。例如,使用初始列表:" Madrid","主要是"。如果用户写了#34; Mad"," Madrid"将是唯一一个被展示的人。但是当他将删除" d" (" Ma" left),"主要"不会被展示。

一个奇怪的事情是,当我不在我的适配器的publishResult中使用clear()和addAll(值)时,删除字符有效,但过滤仅在多个元素中完成。例如,对于100个元素的列表,如果14匹配,则仅显示前14个元素,而不显示14个匹配元素。

如果有人知道我为什么错误使用此代码,欢迎回答:)

适配器

import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.util.Log;
import java.util.ArrayList;

public class AdapterCourseList extends ArrayAdapter<String> {
    public Context context;
    public ArrayList<String> values;
    final public ArrayList<String> originalValues;
    private static final String TAG = AdapterCourseList.class.getSimpleName();

    public AdapterCourseList(Context context, ArrayList<String> valeurs){
        super(context, android.R.layout.simple_list_item_1, valeurs);
        this.context = context;
        this.values = valeurs;
        this.originalValues = valeurs;
    }

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

    public Filter getFilter() {
        Filter mfilter = new Filter() {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                values = (ArrayList<String>)results.values;
                clear();
                notifyDataSetChanged();
                addAll(values);
            }

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

                ArrayList<String> res = new ArrayList<>();
                for(String d: originalValues){
                    Log.d(TAG,d);

                    if(d.toUpperCase().contains(constraint.toString().toUpperCase())){
                        res.add(d);

                    }
                }

                result.count = res.size();
                result.values = res;

                return result;
            }
        };

        return mfilter;
    }
}

活动

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class CourseListActivity extends AppCompatActivity {
    private EditText edit_search;
    private AdapterCourseList adapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course_list);

        SimpleFirebase ref = new SimpleFirebase(this);
        final ArrayList<String> stringList = ref.getCurses();

        edit_search = (EditText) findViewById(R.id.edit_search);
        listView = (ListView) findViewById(R.id.courseList);
        adapter = new AdapterCourseList(this, stringList);
        listView.setAdapter(adapter);

        edit_search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String d = adapter.getItem(position);

                Intent i = new Intent(CourseListActivity.this, AddFormActivity.class);
                i.putExtra("Course", d);

                CourseListActivity.this.setResult(1, i);
                CourseListActivity.this.finish();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

你在ArrayAdapter覆盖了所有这些方法 - 你可能没有。

ArrayAdapter已经实现Filterable并将返回Filter,它会像您一样执行不区分大小写的比较。你应该尝试使用默认的实现,因为它很有可能做你想做的事。

问题出现是因为clear()addAll()ArrayAdapter的内部列表上运行。但是,您使用自己的getCount()列表,因此您的适配器有一些分裂的个性。如果您需要覆盖方法,请尝试扩展BaseAdapter;你会有更多的代码行,但是所有的状态来自哪里都会更清楚。