сгенерировать счетчик из адаптера пользовательского списка - PullRequest
0 голосов
/ 20 мая 2011

Я создаю приложение для заказа еды в ресторане.Когда пользователь выбирает элемент, я нажимаю на нашем сервере, чтобы получить пакет 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 голосов
/ 25 мая 2011

Я не мог заставить это работать, поэтому я переключил его на переключатели. Затем я столкнулся с другой проблемой со значениями, исчезающими из полей edittext при прокрутке списка.

Проведя некоторое исследование, я обнаружил, что помещать элементы управления формы в ListView - очень плохая идея, потому что в Android много ошибок. Смотрите этот предыдущий пост: http://bit.ly/mhvL1D

Я переключился на ScrollView с вложенными LinearLayouts, содержащими различные элементы управления формой.

Волшебно, все мои проблемы исчезли. Вращатель теперь отлично работает, и EditText больше не исчезает при прокрутке.

Я просто неправильно описал весь процесс.

Извлеченный урок: не используйте ListView для элементов управления формы.

0 голосов
/ 20 мая 2011

Можете ли вы объяснить, как вы используете MenuAttributes и LocalActivityRecord ?

Он использует контекст последнего (android.app.LocalActivityManager$LocalActivityRecord@44e933d8), хотя, вероятно, вам необходимо предоставить контекст объекта MenuAttributes.

Для упрощения, у меня будет поле Context context; верхнего уровня в классе MenuAttributes (вы можете установить его как this.context = this; в onCreate()) и использовать это поле как:

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