2013-12-09 6 views
1

Я работаю над тестовым приложением, в котором люди могут видеть вопросы для решения. На странице вопросов есть TextView, чтобы показать вопрос, ListView, чтобы показать варианты и две кнопки для повторения вопросов.Вызов метода setSelected в методе getView ArrayAdapter

Я использую SparseArray связать выбранную позицию опции в ListView на вопрос местоположения, исходят от mAllQuestions типа List<Question>.

Я также с помощью AnswerModel выглядит следующим образом:

public class AnswerModel 
{ 
    public String mAnswerText; 
    public boolean mIsSelected; 
    public AnswerModel(String answerText) 
    { 
     mAnswerText = answerText; 
    } 
    @Override 
    public String toString() 
    { 
     return mAnswerText; 
    } 
} 

и я использую AnswerModel создать ArrayAdapter и это выглядит следующим образом:

ArrayAdapter<AnswerModel> adapter = new ArrayAdapter<AnswerModel>(this, android.R.layout.simple_list_item_activated_1) 
{ 
    @Override 
    public View getView(int position, View convertView, 
      ViewGroup parent) { 
     View v =super.getView(position, convertView, parent);; 
     AnswerModel model = getItem(position); 
     // This is where it does not work. 
     v.setSelected(model.isSelected); 
     return v; 
    } 
} 

и после того, как я создаю мой ArrayAdapter Выполнения следующий код:

List<Answer> answers = getAnswersByQuestionLocation(questionLocation); 
for (int i = 0; i < answers.size(); i++) 
{ 
    answerAdapter.add(new AnswerModel(mOptionLetters[i] +". "+ answers.get(i).getAnswerText())); 
} 

и треска e выше добавляет элементы к ArrayAdapter. Когда щелчок происходит в ListView, я помещаю выбранную позицию опциона и позицию вопроса в SparseArray, набранный mAnswerLocationByQuestionLocation и Я использую его для обновления выбранного фона фона.

if (mAnswerLocationByQuestionLocation.indexOfKey(questionLocation) > -1) 
    { 
     MyModel model = (MyModel)mAnswerList.getItemAtPosition(questionLocation); 
     model.isSelected= true; 
     answerAdapter.notifyDataSetChanged(); 
    } 
} 

Так что проблема v.setSelected не меняет цвет фона выбранного элемента в ListView. Я отлаживал приложение, и все свойства isSelected работают, и он фактически передает true в v.setSelected(model.isSelected) вызов метода.

Я перепробовал много способов, как следует, но они не работали:

  1. Вызов refreshDrawableState() на ListView, а v.
  2. Я позвонил invalidate() и postInvalidate() не работает.
  3. Я позвонил v.post(new Runnable()) и работал v.setSelected(model.isSelected)
  4. У меня есть поворотный селектор, который устанавливает выбранный цвет фона состояния, но не повезло.

Если вы спросите меня, почему я просто не изменить цвет фона v говоря v.setBackgroundColor, который на самом деле работает, но это вызывает другую проблему. Когда я выбираю другой элемент из списка, он остается подсвеченным, и это приводит к двум выделенным элементам в одном списке выбора опций. Я могу позвонить setBackgroundColor(...Color.white) из всех элементов в setOnItemClick обработчиком событий ListView, но когда я это сделаю, нажатие на элемент позже не делает элемент выделенным. Это похоже на кроличью нору.

Любые идеи?

+0

Какой вид вы используете, например, CheckBox или RadioButton ?? – VishalKale

ответ

2

Вы должны использовать listView.setItemChecked(position, true), если вы хотите пункт, чтобы показать, как выбран вместе с установкой вашего режима ListView выбора либо CHOICE_MODE_SINGLE или CHOICE_MODE_MULTIPLE в зависимости от того, если вы хотите, чтобы показать один или более чем один элемент, выбранный сразу.

Обновление от OP:

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

В getView() методе ArrayAdapter, я доступ к ListView переменной и вызвать его setItemChecked() с соответствующими параметрами.

Так это выглядит следующим образом:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = super.getView(position, convertView, parent); 
    AnswerModel model = getItem(position); 
    mAnswerList.setItemChecked(position, model.isSelected); 
    return v; 
} 

, но этот подход вызвал еще одну проблему, так что я должен был обновить onItemClick обработчик события ListView как следующее:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) 
{ 
    setAnswerModel(mCurrentQuestionLocation, false); 
    mAnswerLocationByQuestionLocation.put(mCurrentQuestionLocation, 
      position); 
    setAnswerModel(mCurrentQuestionLocation, true); 
    mAnswerAdapter.notifyDataSetChanged(); 
} 

, который вызывает setAnswerModel метод, который выглядит как это:

private void setAnswerModel(int questionLocation, boolean isSelected) 
{ 
    if (mAnswerLocationByQuestionLocation.indexOfKey(questionLocation) > -1) 
    { 
     int answerLocation = mAnswerLocationByQuestionLocation 
       .get(questionLocation); 
     AnswerModel model = (AnswerModel) mAnswerAdapter.getItem(answerLocation); 
     model.isSelected = isSelected; 
    } 
} 
0

В классе AnswerModel создайте методы set getter для переменной mIsSelected и проверьте, что в getView() адаптера, а затем настройте соответствующим образом, что должно работать.

+0

Как вы думаете, что это отличается от того, что я делаю в своем коде? Вместо getters и seters я непосредственно устанавливаю сам элемент, которого достаточно, так как здесь мне не нужна инкапсуляция. – Tarik

+0

Как вы будете различать две разные переменные myMSslectedModels и почему u создан в классе AnswerModel, нет необходимости, если вы думаете об использовании другого способа, как вы сделали выше правильно? – VishalKale

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