在ArrayAdapter的getView方法中调用setSelected方法

时间:2013-12-09 17:51:46

标签: android listview android-listview

我正在开发一个测试应用程序,人们可以在其中查看要解决的问题。在问题页面上,有TextView来显示问题,ListView显示选项,两个按钮用于在问题之间来回切换。

我正在使用SparseArrayListView中所选的选项位置与mAllQuestionsList<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()));
}

并且上面的代码会将项目添加到ArrayAdapter。当ListView上发生点击时,我将选定的选项位置和问题位置添加到SparseArray键入的mAnswerLocationByQuestionLocation我用它来更新所选的选项背景。< / p>

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. 我有一个可绘制的选择器,用于设置选定的状态背景颜色,但没有运气。
  5. 如果你问我为什么我只是不改变v的背景颜色,说v.setBackgroundColor确实有效,但它会导致另一个问题。当我从列表中选择另一个项目时,它会保持突出显示,这会导致单个选项选项列表中的两个突出显示的项目。我可以在setBackgroundColor(...Color.white)的{​​{1}}事件处理程序中调用所有项目的setOnItemClick,但是当我这样做时,稍后点击某个项目不会突出显示该项目。它就像一个兔子洞。

    有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果您希望项目显示为已选中,并且将listView.setItemChecked(position, true)选择模式设置为ListViewCHOICE_MODE_SINGLE,则需要使用CHOICE_MODE_MULTIPLE,具体取决于是否您希望一次显示一个或多个项目。

从OP更新:

我正在标记你的答案,因为实际上这个答案在我采取以下路径之后起作用了:

getView()的{​​{1}}方法中,我正在访问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; } 的{​​{1}}事件处理程序,如下所示:

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();
}

答案 1 :(得分:0)

在AnswerModel类中为mIsSelected 变量创建getter setter方法,并在Adapter的getView()中检查,然后适当地设置应该有效。