如何使用自定义arrayadapter设置旋转器上的值



你好,我尝试使用自定义数组适配器设置旋转器的值,使用从web服务加载数据的webservices。

这是我的mainactivity,我调用并填充旋转器

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_newsfeed);
        txtdesc = (EditText) findViewById(R.id.txtdesc);
        StrictMode.ThreadPolicy policy =
                new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        categorySpinner = (Spinner) findViewById(R.id.category);
        new getServices().execute();
    }

这是我在textview上设置文本的适配器。

公共类Post_Service_Adapter扩展ArrayAdapter {

    Context context;
    public Post_Service_Adapter(Context context, int resource, List<post_service_entity> objects) {
        super(context, resource, objects);
        this.context = context;
    }
    private class ViewHolder {
        TextView sid;
        TextView sname;
        TextView sdesc;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        post_service_entity chat = getItem(position);
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.spinner_items,
                    null,false);
            holder = new ViewHolder();
            holder.sid = (TextView) convertView.findViewById(R.id.ser_id);
            holder.sname = (TextView) convertView.findViewById(R.id.ser_name);
            holder.sdesc = (TextView) convertView
                    .findViewById(R.id.ser_desc);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.sid.setText(chat.getServiceid());
        holder.sname.setText(chat.getServicename());
        holder.sdesc.setText(chat.getServicedetail());
        return convertView;
    }
}

这是我的spinner xml文件,我只是想显示名称。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/ser_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />
    <TextView
        android:id="@+id/ser_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:padding="5dip"
        android:textColor="@color/accentcolor"
        android:textSize="15sp" />
    <TextView
        android:id="@+id/ser_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />
</LinearLayout>

这是我的服务,从web加载数据。我正在尝试使用此服务设置旋转器上的数据。

 private class getServices extends AsyncTask<String, Void, String> {
        ProgressDialog mProgressDialog;
        @Override
        protected void onPreExecute() {
            res = null;
            mProgressDialog = ProgressDialog.show(
                    Create_NewsFeed.this, "",
                    "Loading...");
            mProgressDialog.setCancelable(true);
        }
        @Override
        protected String doInBackground(String... params) {
            PutUtility objClient = new PutUtility();
            try {
                res = objClient.getData("");
            } catch (Exception e) {
                  Toast.makeText(Create_NewsFeed.this, String.valueOf(e.getMessage()), Toast.LENGTH_SHORT).show();
            }
            return res;
        }
        @Override
        protected void onPostExecute(String ress) {
            try {
                if (ress == null) {
                    mProgressDialog.dismiss();
                }
                JSONArray jArray = new JSONArray(ress.toString());
                if (jArray.length() == 0) {
                    mProgressDialog.dismiss();
                } else {
                    Services = new ArrayList<post_service_entity>();
                    for (int i = 0; i < jArray.length(); i++) {
                        JSONObject json = jArray.getJSONObject(i);
                        post_service_entity service = new post_service_entity();
                        service.setServiceid(json.getString("id"));
                        service.setServicename(json.getString("name"));
                        service.setServicedetail(json.getString("detail"));
                        Services.add(service);
                    }
                    post_service_adapter = new Post_Service_Adapter(getApplicationContext(), R.layout.spinner_items, Services);
                    /*categoryAdapter.setDropDownViewResource
                            (android.R.layout.simple_spinner_dropdown_item);*/
                    categorySpinner.setAdapter(post_service_adapter);
                   // post_service_adapter.notifyDataSetChanged();
                }
                 mProgressDialog.dismiss();
            } catch (Exception objEx) {
                objEx.printStackTrace();
            }
        }
    }

这是我的错误日志。

10-12 18:26:22.358  14556-14556/fourever.textile E/ArrayAdapter﹕ You must supply a resource ID for a TextView
10-12 18:26:22.359  14556-14556/fourever.textile D/AndroidRuntime﹕ Shutting down VM
10-12 18:26:22.359  14556-14556/fourever.textile W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40d479a8)
10-12 18:26:22.375  14556-14563/fourever.textile D/jdwp﹕ processIncoming
10-12 18:26:22.375  14556-14563/fourever.textile D/jdwp﹕ handlePacket : cmd=0x1, cmdSet=0xC7, len=0x14, id=0x400000E1, flags=0x0, dataLen=0x9
10-12 18:26:22.376  14556-14563/fourever.textile D/jdwp﹕ sendBufferedRequest : len=0x34
10-12 18:26:22.376  14556-14556/fourever.textile E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
            at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
            at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
            at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
            at android.widget.Spinner.onMeasure(Spinner.java:439)
            at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:410)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1411)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:698)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15635)
            at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1220)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.widget.ScrollView.onMeasure(ScrollView.java:321)
            at android.view.View.measure(View.java:15635)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
            at android.view.View.measure(View.java:15635)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1411)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:698)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2200)
            at android.view.View.measure(View.java:15635)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2165)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1249)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1443)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4872)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
            at android.view.Choreographer.doCallbacks(Choreographer.java:579)
            at android.view.Choreographer.doFrame(Choreographer.java:548)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
            at android.os.Handler.handleCallback(Handler.java:800)
            at android.os.Handler.dispatchMessage(Handler.java:100)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5410)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
    at

首先,注意错误日志的第一行。

10-12 18:26:22.358  14556-14556/fourever.textile E/ArrayAdapter﹕ You must supply a resource ID for a TextView

查看你的代码:

post_service_adapter = new Post_Service_Adapter(getApplicationContext(), R.layout.spinner_items, Services);

查看ArrayAdapter.java的源代码

/**
 * Constructor
 *
 * @param context The current context.
 * @param textViewResourceId The resource ID for a layout file containing a TextView to use when
 *                 instantiating views.
 * @param objects The objects to represent in the ListView.
 */
public ArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
    init(context, textViewResourceId, 0, objects);
}

你必须传递一个包含单个TextView的textViewResourceId作为第二个参数,但是你传递了一个包含多个TextView的布局资源R.layout.spinner_items

Android官方文档:http://developer.android.com/reference/android/widget/ArrayAdapter.html

一个由任意数组支持的具体BaseAdapter对象。默认情况下,该类期望提供的资源id引用单个TextView。如果你想用一个更复杂的布局时,使用也接受字段id的构造函数。这个字段id应该在更大的布局资源中引用TextView。

然而,TextView被引用,它将被填充数组中每个对象的toString()。的列表或数组自定义对象。重写对象的toString()方法确定列表中的项目将显示什么文本。

使用textview以外的东西来显示数组,for实例,ImageViews,或者有一些数据除了toString()结果填充视图,重写getView(int, View, ViewGroup)到返回你想要的视图类型。

ArrayAdapter.java的代码:

private View createViewFromResource(int position, View convertView, ViewGroup parent,
        int resource) {
    View view;
    TextView text;
    if (convertView == null) {
        view = mInflater.inflate(resource, parent, false);
    } else {
        view = convertView;
    }
    try {
        if (mFieldId == 0) {
            //  If no custom field is assigned, assume the whole resource is a TextView
            text = (TextView) view;
        } else {
            //  Otherwise, find the TextView field within the layout
            text = (TextView) view.findViewById(mFieldId);
        }
    } catch (ClassCastException e) {
        Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
        throw new IllegalStateException(
                "ArrayAdapter requires the resource ID to be a TextView", e);
    }
    T item = getItem(position);
    if (item instanceof CharSequence) {
        text.setText((CharSequence)item);
    } else {
        text.setText(item.toString());
    }
    return view;
}

最新更新