2014-11-04 2 views
1

Доброго дня,Android вызова findViewById от адаптера пользовательского класса

Поэтому у меня есть пользовательский элемент управления ListView с пользовательским адаптером, который имеет элемент, который является флажком для каждой строки. В моем getView я применил setOnCheckedChangeListener и обработчики onCheckedChanged для моего флажка.

Теперь проблема:

Всякий раз, когда я проверяю/снимите один из элементов списка, я хотел бы обновить внешний TextView со значениями, я хочу (предположим, что для каждого элемента есть цена связана с тем Я хочу показать ниже списка общую цену).

Как мне добраться до «внешнего» вида с помощью getView адаптера? Какой еще обходной путь?

Я оставляю здесь какую-то часть моего кода на функции GetView моего пользовательского адаптера:

CheckBox name = (CheckBox) view.findViewById(R.id.product); 
    name.setText(content[i][0]); 
    final View v = view; 
    final int position = i; 
    name.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton group, boolean isChecked) { 
      setCheckedItem(position); 
      EditText quantity = (EditText) v.findViewById(R.id.product_quantity); 
      content[position][3] = quantity.getText().toString(); 
      Iterator<String> it = getCheckedItems().values().iterator(); 
      Double total = 0.0; 
      for (int i=0;i<getCheckedItems().size();i++){ 
       Integer quantity_p = Integer.parseInt(getItem(position)[3]); 
       Double price = Double.parseDouble(getItem(position)[2]); 
       total += quantity_p*price; 
      } 
      TextView total_price = (TextView) findViewById(R.id.total_products_price); 
      total_price.setText(total.toString()); 
     } 
    }); 

Обратите внимание, что последние две строки: Я знаю, что я не могу назвать findViewById, но я не знаю, что делать к настоящему времени. Любые предложения были бы хорошими, спасибо.

+0

можете разместить здесь свой код класса и xml-файл? –

+0

введите класс адаптера в класс активности. –

ответ

1

Вы можете передать свой TextView адаптеру в конструкторе. После этого вы можете иметь private static класс, который будет реализовывать CompoundButton.OnCheckedChangedListener так:

private static class MyOnCheckedChangedListener 
        implements CompoundButton.OnCheckedChangedListener { 
    TextView myView; 
    public MyOnCheckedChangedListener (TextView viewToChange) { 
     myView = viewToChange; 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton group, 
           boolean isChecked) { ... } 
} 

После этого просто setOnCheckedChangedListenernew MyOnCheckedChangedListener (myTextView) (тот, который вы передали Adapter), и вы готовы пойти.

+0

То, что я сделал, это передать TextView в construtor, а затем использовать его всякий раз, когда мне нравится, и он просто отлично работает: D – user3424226

0

Мои могли бы сделать так:

  1. Вы можете передать TextView ссылку на конструктор адаптера и использовать его, чтобы изменить его значение.

  2. Но хороший подход состоит в том, чтобы реализовывать в вашей деятельности interface и в своем методе обновления метода textview. Для вас адаптер ссылается на ссылку на действие в конструкторе и используйте его ссылку для вызова метода обратного вызова interface.

а) имеют interace в

public Interface UpdateTextviewInterface { void updateTextview(String value); }

б) Пусть ваша деятельность реализуют этот интерфейс

public MainActivity extends Activity implments UpdateTextviewInterface

и переопределить этот метод.

c) Передайте ссылку на объект на конструктор адаптера. С помощью справки по действию updateTextview метод обновления вашего текстового поля.

0

Это просто мысль и теория. Но можете ли вы сделать статический метод в своей деятельности, где TextView, который вы хотите изменить, объявляется, и в этом методе напишите код для изменения вашего текста так, как вы хотите его изменить.

Затем вызовите этот статический метод из BaseAdapter. Я говорю статично, поэтому вам не нужно создавать новый экземпляр целого класса.

+0

Я попытался добавить статический метод, вызывающий findViewById внутри него, не разрешен. («Нестатический метод findViewById не может ссылаться на статический контекст».) – user3424226

2

Установите класс адаптера в класс активности. Объявить TextView total_price в основном классе активности затем

total_price = (TextView) findViewById(R.id.total_products_price); 

в вашем при создании файла. Затем вы можете получить доступ к total_price внутри onCheckedChanged. Попробуйте это, это может сработать.

+0

Это может сработать, но я действительно хочу убежать от этого решения, потому что это было бы беспорядок со всеми этими вещами, смешанными в одном файле:/ – user3424226

+0

Plz поделиться полным кодом, как я могу получить id таким образом? –

Смежные вопросы