我正在开发一个测试应用程序,人们可以在其中查看要解决的问题。在问题页面上,有TextView
来显示问题,ListView
显示选项,两个按钮用于在问题之间来回切换。
我正在使用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()));
}
并且上面的代码会将项目添加到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)
方法调用。
我尝试了很多方法如下,但它们不起作用:
refreshDrawableState()
ListView
上致电v
。invalidate()
并且postInvalidate()
无效。 v.post(new Runnable())
并正在运行v.setSelected(model.isSelected)
如果你问我为什么我只是不改变v
的背景颜色,说v.setBackgroundColor
确实有效,但它会导致另一个问题。当我从列表中选择另一个项目时,它会保持突出显示,这会导致单个选项选项列表中的两个突出显示的项目。我可以在setBackgroundColor(...Color.white)
的{{1}}事件处理程序中调用所有项目的setOnItemClick
,但是当我这样做时,稍后点击某个项目不会突出显示该项目。它就像一个兔子洞。
有什么想法吗?
答案 0 :(得分:2)
如果您希望项目显示为已选中,并且将listView.setItemChecked(position, true)
选择模式设置为ListView
或CHOICE_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()中检查,然后适当地设置应该有效。