2012-05-11 2 views
1

Я пытаюсь реализовать пользовательский адаптер массива, который должен визуализировать представление списка с одним текстовым и одним флажком. Мне нужно помнить о выборе, и я хочу, чтобы каждый раз, когда один из вариантов был chececked, все остальные становятся неконтролируемыми в качестве радиообмена.Обновить представление списка в CustomArrayAdaptor с checbox

Это мой код

public class RAnswerAdapter extends ArrayAdapter<RAnswer> { 

private final ArrayList<RAnswer> list; 
private final Activity context; 

public RAnswerAdapter(Activity context, ArrayList<RAnswer> list) { 
    super(context, R.layout.answer_item, list); 
    this.context = context; 
    this.list = list; 
} 

static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.answer_item_radio, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.answerName); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkAnsw); 

     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         Answer element = (Answer) viewHolder.checkbox.getTag(); 

         for(Answer a: list) 
          //if true 
          if(a.isSelected()) 
           //I set at false 
           a.setSelected(false); 

         //I set the new at true 
         element.setSelected(buttonView.isChecked());  

         //I refresh the list 
         notifyDataSetChanged(); 
        } 
       }); 



     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 
    } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.text.setText(list.get(position).getAnswer_option()); 
    holder.checkbox.setChecked(list.get(position).isSelected()); 
    return view; 
} 

}

код на самом деле работает странным образом ... Первый 4 элемента работы списка отлично, и все остальные не переключаем! Почему это? Где ошибка?

Спасибо за помощь

+0

Являются ли первые четыре элемента единственными видимыми элементами? т.е. Ошибка происходит, когда вы переходите к строке и установите это поле? – Sam

+0

Кроме того, пожалуйста, разместите ошибки logcat, иначе нам просто нужно угадать ... – Sam

+0

Если число элементов меньше четырех, ошибка возникает только на первом (например: есть 3 элемента и работает только на первые 2 элемента). Они не единственные видимые. Обычно я вижу не менее 8 элементов. Я знаю, это очень странно! В logcat ошибок нет! – michoprogrammer

ответ

0

Я думаю, что вы должны смотреть на этот полезный пост здесь StackOverflow. Если вы посмотрите есть ссылка на учебник, который я сделал, и это может быть решением вашей проблемы;)

Link CheckedListView

+0

Grazie Simone =) Я знаю, как реализовать список, как вы реализовали в своем учебнике. Проблема в том, что я пытаюсь создать listview для обработки одного выбора, а не для множественного выбора. – michoprogrammer

+0

Отлично :) Если вы не используете мультивыбор, лучше использовать радио, а не флажок, чтобы разрешить выбор пользователя. Поэтому я думаю, что вы можете просто использовать предложенное решение внутри sdk. Вы должны установить тип выделения в свой список, используя следующую строку: listview.setChoiceMode (ListView.CHOICE_MODE_SINGLE); –

+0

Существует две проблемы с использованием предложенного решения: 1) Дизайнер запросил, чтобы радиообъекты были равны флажкам. (Квадрат, а не круг: /) 2) С «ListView.CHOICE_MODE_SINGLE» я не могу сохранить состояние выбранных элементов (возможно, это возможно, но я не знаю, как это сделать). Итак, я передал его с помощью флажков ... – michoprogrammer

0

У меня возникли проблемы с выявлением проблемы в коде, не имея возможности самостоятельно отлаживать его. Я предлагаю добавить переменную к вашему адаптеру для хранения индекса текущего элемента, так что вам не нужно искать list на каждом клике. Также добавьте оператор if в свой onCheckChanged(), чтобы не принимать меры, если ответ уже проверен (как будто он сейчас ведет себя) или даже позволяет пользователю снять текущий ответ.

Чтобы нажать опцию ChoiceMode из ListView в себя, я представлю это:

public class Example extends Activity implements OnItemClickListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     String[] array = {"one", "two", "three"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, array); 

     ListView listView = (ListView) findViewById(R.id.list); 
     listView.setAdapter(adapter); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     listView.setOnItemClickListener(this); 
    } 

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Log.v("Example", "ItemClick: " + ((ListView) parent).getCheckedItemPosition()); 
    } 
} 

Это приложение является коротким и сладким. Вы можете создать свой собственный макет и передать его адаптеру, вот текущий checkbox example. И вы можете ссылаться на позицию (или id или текст) проверенной строки в любой точке; даже сохраняйте все ответы в базе данных по мере поступления.

Сообщите мне, если кто-либо из них поможет.

+0

Проблема, которая возникла у зрителя, который не обновил мой список, поэтому я попытался реализовать его самым старым способом, без какого-либо статического класса, и он работает хорошо! Я знаю, что это не лучшее решение, но этот конкретный список является частным случаем моего приложения, и, самое большее, есть 10 элементов, поэтому я думаю, что проблем с памятью не так уж много. Если на этапе тестирования я столкнусь с некоторыми проблемами, я попробую свой путь. Спасибо всем. – michoprogrammer

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