使用自定义适配器的AutoCompleteTextView ClassCastException异常 [英] ClassCastException using a custom adapter for an AutoCompleteTextView

查看:195
本文介绍了使用自定义适配器的AutoCompleteTextView ClassCastException异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Xamarin,我有一个AutoCompleteTextView自定义适配器的麻烦。

In Xamarin, I am having trouble with a custom adapter for a AutoCompleteTextView.

下面是我的code:

private void SetupAutoCompleteTextViewWithCustomAdapter()
{
    List<CustomItem> customItems = new List<CustomItem>();

    CustomItem customItem = new CustomItem();
    customItem.Heading = "TestHeading";
    customItem.SubHeading = "TestSubHeading";
    customItems.Add(customItem);

    customItem = new CustomItem();
    customItem.Heading = "TestHeading 2";
    customItem.SubHeading = "TestSubHeading 2";
    customItems.Add(customItem);

    customItem = new CustomItem();
    customItem.Heading = "TestHeading 3";
    customItem.SubHeading = "TestSubHeading 3";
    customItems.Add(customItem);

    AutoCompleteTextView AutoCompleteTextViewWithCustomAdapter = (AutoCompleteTextView) FindViewById(Resource.Id.AutoCompleteTextView);
    AutoCompleteTextViewWithCustomAdapter.Adapter = new CustomAdapter (this, customItems);

}

下面是我的自定义适配器:

Here is my custom adapter:

public class CustomAdapter : BaseAdapter<CustomItem> {
    List<CustomItem> items;
    Activity context;
    public CustomAdapter(Activity context, List<CustomItem> items)
        : base()
    {
        this.context = context;
        this.items = items;
    }
    public override long GetItemId(int position)
    {
        return position;
    }
    public override CustomItem this[int position]
    {
        get { return items[position]; }
    }
    public override int Count
    {
        get { return items.Count; }
    }
    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var item = items[position];

        View view = convertView;
        if (view == null) // no view to re-use, create new
            view = context.LayoutInflater.Inflate(Resource.Layout.CustomView, null);
        view.FindViewById<TextView>(Resource.Id.TextViewMapHeading).Text = item.Heading;
        view.FindViewById<TextView> (Resource.Id.TextViewMapHeading).TextSize = 20;
        view.FindViewById<TextView>(Resource.Id.TextViewItem).Text = item.SubHeading;
        view.FindViewById<ImageView>(Resource.Id.Image).SetImageResource(item.ImageResourceId);

        return view;
    }
}

下面是我的自定义项目类:

Here is my custom item class:

public class CustomItem
{
    public string Heading { get; set; }
    public string SubHeading { get; set; }
    public int ImageResourceId { get; set; }
}

下面是我的CustomView布局文件:

Here is my CustomView layout file:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">
    <LinearLayout
        android:id="@+id/Text"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dip">
        <TextView
            android:id="@+id/TextViewMapHeading"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="28sp" />
        <TextView
            android:id="@+id/TextViewItem"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:autoLink="all" />
    </LinearLayout>
    <ImageView
        android:id="@+id/Image"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:padding="5dp"
        android:src="@drawable/icon"
        android:visibility="invisible"
        android:layout_alignParentRight="true" />
</RelativeLayout>

下面是我得到的错误:

java.lang.ClassCastException:simplemapdemo.CustomAdapter不能
  转换为android.widget.Filterable

java.lang.ClassCastException: simplemapdemo.CustomAdapter cannot be cast to android.widget.Filterable

我可以请有一定的帮助得到这个工作?

Can I please have some help to get this working?

在此先感谢

推荐答案

由于该适配器用于 AutoCompleteTextView 必须是工具可筛选接口,所以修改 CustomAdapter 类似以下内容:

Because the Adapter used for AutoCompleteTextView must be implements Filterable interface, so modify your CustomAdapter like following:

public class CustomAdapter extends BaseAdapter<CustomItem> implements Filterable {

    ArrayFilter mFilter;
    ...

    // please override other method in BaseAdatper as your need
    ...

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

    // you can modify the custom Filter used for AutoCompleteTextView as your need
    private class ArrayFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();

            if (mOriginalValues == null) {
                synchronized (mLock) {
                    mOriginalValues = new ArrayList<T>(mObjects);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                ArrayList<T> list;
                synchronized (mLock) {
                    list = new ArrayList<T>(mOriginalValues);
                }
                results.values = list;
                results.count = list.size();
            } else {
                String prefixString = prefix.toString().toLowerCase();

                ArrayList<T> values;
                synchronized (mLock) {
                    values = new ArrayList<T>(mOriginalValues);
                }

                final int count = values.size();
                final ArrayList<T> newValues = new ArrayList<T>();

                for (int i = 0; i < count; i++) {
                    final T value = values.get(i);
                    final String valueText = value.toString().toLowerCase();

                    // First match against the whole, non-splitted value
                    if (valueText.startsWith(prefixString)) {
                        newValues.add(value);
                    } else {
                        final String[] words = valueText.split(" ");
                        final int wordCount = words.length;

                        // Start at index 0, in case valueText starts with space(s)
                        for (int k = 0; k < wordCount; k++) {
                            if (words[k].startsWith(prefixString)) {
                                newValues.add(value);
                                break;
                            }
                        }
                    }
                }

                results.values = newValues;
                results.count = newValues.size();
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //noinspection unchecked
            mObjects = (List<T>) results.values;
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
}

您可以参阅 ArrayAdapter 的源$ C ​​$ C。

You can refer to the ArrayAdapter's source code.

这篇关于使用自定义适配器的AutoCompleteTextView ClassCastException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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