EditText与CustomListView的集成

时间:2017-11-05 16:42:27

标签: java android listview android-edittext

向我的开发者致以问候 我正在开展一个项目,我必须处理联系人列表, 我创建了一个联系人列表视图和一个EditText用于搜索目的, 除了搜索之外,我的ListView正如我所期望的那样工作 这是我的列表视图

\t

这是我的listviewitem

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">

        <EditText
            android:id="@+id/contacts_search"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableEnd="@drawable/ic_search"
            android:drawableRight="@drawable/ic_search"
            android:hint="@string/contacts_search"
            android:maxLines="1" />

        <ListView
            android:id="@+id/contactsListView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@color/colorAccent"
            android:dividerHeight="1dp"
            android:footerDividersEnabled="false" />
    </LinearLayout>

我正在使用

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/contact_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/contacts_image"
        android:layout_gravity="center" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/list_view_margin_vertical"
        android:layout_marginTop="@dimen/list_view_margin_vertical"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/contact_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
            android:textColor="@color/colorBlack" />

        <TextView
            android:id="@+id/contact_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
            android:textColor="@color/colorGrey" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/contact_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:clickable="false" />
</LinearLayout>

在我的适配器类中,我有getfilter函数,它不能正常工作

SEARCH.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            contactAdapter.getFilter().filter(s); // not working,throwing exception when i do CONTACTS.get(position); in adapter getview()
        }
    });

但是我无法获得搜索视图的结果,它在索引超出绑定异常时崩溃,在适配器类的getView()中我正在尝试CONTACTS.get(position), 任何帮助都是适当的

1 个答案:

答案 0 :(得分:0)

向我的同事们问候, 所以我想我找到了解决问题的方法,我认为这也是最佳解决方案, 我已经在我的适配器类

中对getFilter函数进行了一些更改
@NonNull
@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (constraint.length() == 0) {
                results.count = ORIGNAL.size();
                results.values = ORIGNAL;
            } else if (constraint.length() > 0) {
                List<Contact> filtered = new ArrayList<>();
                for (Contact contact : ORIGNAL) {
                    if (contact.getName().toLowerCase().contains(constraint)) {
                        filtered.add(contact);
                    }
                }
                results.count = filtered.size();
                results.values = filtered;
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (constraint.length() == 0) {
                CONTACTS.clear();
                CONTACTS.addAll(ORIGNAL);
            } else if (constraint.length() > 0) {
                CONTACTS.clear();
                CONTACTS.addAll((ArrayList<Contact>) results.values);
            }
            notifyDataSetChanged();
        }
    };
}

另外一件事我发现id我用简单的赋值运算符指定我的orignal arraylist&#34; =&#34;它传递了联系人数组的地址, 我已经使用这些行在我的适配器构造函数

中分配我的orignal数组
this.ORIGNAL = new ArrayList<>();
this.ORIGNAL.addAll(contacts);

我认为这是搜索自定义列表视图的唯一简单且最快捷的方式,但如果你们中的任何人认为有更好的方法,请在下面分享。