从自定义列表适配器生成微调器

时间:2011-05-20 15:54:40

标签: java android spinner listadapter

我正在构建一个应用程序,用于从餐厅订购食物。当用户选择一个项目时,我点击我们的服务器以检索包含该项目选项的JSON包。 (例如:面包:白色,小麦)。

我要做的是使用自定义列表适配器生成用户在将项目添加到购物车之前需要选择的所有选项的列表。这很好用,除非我点击我得到的微调器:

05-20 15:12:53.602: ERROR/AndroidRuntime(696): FATAL EXCEPTION: main
05-20 15:12:53.602: ERROR/AndroidRuntime(696): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@44e933d8 is not valid; is your activity running?
05-20 15:12:53.602: ERROR/AndroidRuntime(696):at android.view.ViewRoot.setView(ViewRoot.java:505)
05-20 15:12:53.602: ERROR/AndroidRuntime(696):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
05-20 15:12:53.602: ERROR/AndroidRuntime(696):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-20 15:12:53.602: ERROR/AndroidRuntime(696):at android.view.Window$LocalWindowManager.addView(Window.java:424)

等...

它与将正确的上下文传递给我用于微调器的数组适配器有关,但我觉得我已经尝试了所有可能的选项。这个街区是罪魁祸首:

ArrayAdapter<String> adapter = new ArrayAdapter<String> (parent.getContext(), android.R.layout.simple_spinner_item, options); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); attrSpinner.setAdapter(adapter);

这是整个自定义列表适配器,因此您可以看到我正在使用此块的位置:

 public class ItemListAdapter extends BaseAdapter {
    public ItemListAdapter(Context context) {
        Context mContext = context;
    }

    public int getCount() {                 
        return attributes.length();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View attr_item = li.inflate(R.layout.menu_attributes, null);

        TextView attrName = (TextView) attr_item.findViewById(R.id.attr_name);
        CheckBox attrCheck = (CheckBox) attr_item.findViewById(R.id.attr_checkbox);
        EditText attrText = (EditText) attr_item.findViewById(R.id.attr_edittext);
        Spinner  attrSpinner = (Spinner) attr_item.findViewById(R.id.attr_spinner);
        try {
            String attrID = attributes.getJSONObject(position).getString("AttrID");
            String type = attributes.getJSONObject(position).getString("Type");
            String itemLabel = attributes.getJSONObject(position).getString("ItemLabel");
            JSONArray values = attributes.getJSONObject(position).getJSONArray("Values");

            if (type.equals("select")) {
                attrCheck.setVisibility(View.GONE);
                attrText.setVisibility(View.GONE);

                ArrayList<String> options = new ArrayList<String>();
                for (int i=0;i<values.length();i++) {
                    options.add(values.getJSONObject(i).getString("Name"));
                    Log.i("value options", values.getJSONObject(i).getString("Name"));
                }

//HERE IS THE PROBLEM
                ArrayAdapter<String> adapter = new ArrayAdapter<String> (parent.getContext(), android.R.layout.simple_spinner_item, options);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                attrSpinner.setAdapter(adapter);

            }
            else if (type.equals("checkbox")){
                attrSpinner.setVisibility(View.GONE);
                attrText.setVisibility(View.GONE);
            }
            else if (type.equals("textarea")){
                attrSpinner.setVisibility(View.GONE);
                attrCheck.setVisibility(View.GONE);
            }
            else if (type.equals("text")){
                attrSpinner.setVisibility(View.GONE);
                attrCheck.setVisibility(View.GONE);
            }

            attrName.setText(itemLabel);

        } catch (JSONException e) {
                // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return attr_item;
    }

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:0)

您能解释一下如何使用 MenuAttributes LocalActivityRecord

它正在使用后者的Context(android.app.LocalActivityManager$LocalActivityRecord@44e933d8),而您可能需要提供MenuAttributes对象的Context。

为了简化,我在Context context;课程中有一个上级MenuAttributes字段(您可以在this.context = this;中将其设置为onCreate())并将该字段用作:

ArrayAdapter<String> adapter = new ArrayAdapter<String> (context, android.R.layout.simple_spinner_item, options); 

答案 1 :(得分:0)

我无法让它工作,所以我把它切换到单选按钮。然后我遇到另一个问题,当滚动列表时,值从edittext字段中消失。

在做了一些研究后,我发现在ListView中放置表单控件是一个非常糟糕的主意,因为它在android中有很多bug。请参阅上一篇文章:http://bit.ly/mhvL1D

我切换到包含各种表单控件的嵌套LinearLayouts的ScrollView。

奇怪的是,我所有的问题都消失了。微调器现在效果很好,EditText在滚动时不再消失。

我只是把整个过程弄错了。

经验教训:不要将ListView用于表单控件。