在我的QuestionsActivity
中,我正在展示一个问题和一堆答案。问题显示在TextView
上,答案显示在由ListView
组成的TextViews
上。有一个ActionButton
名为“检查答案”,点击它后,它会通过更改TextView
中ListView
的背景颜色来显示正确的答案。
后台更改代码如下所示:
if (allAnswers.get(i).isCorrect())
{
mAnswerList.getChildAt(i).setBackgroundColor
(getResources().getColor(R.color.correct_answer_background));
return;
}
现在这个Button
的页脚部分有两个QuestionsActivity
名为PreviousQuestionButton
和NextQuestionButton
,它们基本上是问题之间的导航按钮。
问题是,当我点击“检查答案”按钮后转到下一个问题时,答案背景颜色不会消失并保留在下一个问题答案选项中。我尝试了invalidate()
refreshDrawableState()
方法ListView
,但没有运气!
这是显示给定问题答案的方法:
private void showAnswers(int questionLocation)
{
int questionId = mAllQuestions.get(questionLocation).getQuestionId();
List<Answer> answers = mAnswerRepository.getAllByQuestionId(questionId);
mAnswerAdapter.clear();
for (int i = 0; i < answers.size(); i++)
{
mAnswerAdapter.add(mOptionLetters[i] + ". "
+ answers.get(i).getAnswerText());
}
mAnswerAdapter.notifyDataSetChanged();
}
我的问题
我想要的是当我点击下一个或上一个按钮时,ListView中正确答案的背景颜色应该消失,以便下一个和上一个问题按钮可以向用户显示未选择的答案选项列表。是否有任何方法可以将ListView重置为没有应用任何背景的状态?
对于选定的答案选项,我使用mAnswerList.clearChoices()
取消选择但不适用于正确的答案背景颜色。
答案 0 :(得分:2)
好吧,要重置颜色,您可以通过创建新的适配器来重置硬件。所以不要clear
和add
,因为这可能会使观点处于以前的状态。我不太确定这个,因为我没有清理或添加适配器,但总是创建一个新的来满足我的新需求。
无论如何,事情可能不会朝着你想要的方向前进的另一个原因是视图可能会被回收,因为我们谈论的是ListView
。因此,如果要突出显示列表项,则应通过将其初始化为false并在用户选择一个突出显示状态为true的情况下,在数据模型中保留有关突出显示的信息。我认为Answer
类至少包含以下内容:
public class Answer {
private String data;
private boolean correct;
public String getData() {
return data;
}
public boolean isCorrect() {
return correct;
}
@Override
public String toString() {
return data;
}
}
所以你的适配器可能看起来很接近 - getView
方法是最重要的注意事项(如果答案不正确或者适配器不应突出显示正确答案,请不要忘记设置为默认背景):< / p>
public class MyAdapter extends ArrayAdapter<Answer> {
private boolean showCorrectAnswer;
private List<Answer> modelAnswers;
public MyAdapter(Context context, List<Answer> answers) {
super(context, android.R.layout.simple_list_item_1, answers);
this.modelAnswers = answers;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if(showCorrectAnswer && modelAnswers.get(position).isCorrect()) {
view.setBackgroundColor(getContext().getResources().getColor(R.color.correct_answer_background));
} else {
view.setBackgroundColor(getContext().getResources().getColor(R.color.default_background));
}
}
public void setShowCorrectAnswer(boolean showCorrectAnswer) {
this.showCorrectAnswer = showCorrectAnswer;
notifyDataSetChanged();
}
}
您需要做的是保留对此自定义适配器的引用,如果您需要突出显示正确答案,或者只需调用setShowCorrectAnswer(true / false);
。它将触发重绘,在getView()
中,它将根据适配器状态和正确答案决定做什么。
希望它有意义......我在喝啤酒的同时写下了这一切:)
答案 1 :(得分:1)
基本上,我同意payeli的回答 - 您应该在“下一个/上一个问题”按钮中更改所选答案的背景。
但是有这个问题: “有没有任何方法可以将ListView重置为没有应用任何背景的状态?”
答案(据我所知)是:不是直接的。但有两种解决方法。
如果您调用notfiyDataSetChange,则不会完全重绘所有视图。如果可能,只更改适当的值。这主要是出于性能原因。 (想象一下,有1000个联系人,图像和名称被倾倒并重新绘制)
那你怎么处理这个? (其他然后在onClick方法中重新设置背景)因为你说这些项目是问题的答案,我认为你不关心性能,因为它们不会太多。
然后你可以简单地说:
A)创建适配器的新实例,而不是更改旧实例中的数据。切换适配器时,列表中的所有视图都将被删除,因此新适配器中不会发生回收。
B)创建自定义适配器,覆盖getView方法并确保每次请求视图时,都返回一个新视图,因此不会发生回收。
再说一遍:这真的不是“性能友好”,不应该用于包含大量项目的大型列表!
如果您想了解更多,请随意在评论中提问或阅读Adapter类的参考,尤其是getView方法的参数convertView。 (http://developer.android.com/reference/android/widget/Adapter.html)
答案 2 :(得分:0)
根据我的理解,你需要在列表视图行之一中更改文本视图的颜色,即包含正确答案的行。
如果这是您的问题,则点击按钮只需清除列表视图并重新创建列表视图。不重新创建列表视图时,请检查包含正确答案的行的位置。获取行位置后,只需更改文本视图的颜色。
对于Ex:在您的Adapter类中,在getView();
中检查为fallowsfor ( int i = 0; i < position.length ; i++ )
{
if(position == your_required_position){
{
textview.setColor(Color.BLUE);
}else{
textview.setColor(Color.BLACK);
}
}
答案 3 :(得分:0)
在“检查答案”按钮的onClickListener中,您需要重置颜色:
void onClick (View v){
..............
mAnswerList.getChildAt(currentQuestion).setBackgroundColor
(getResources().getColor(R.color.default_answer_background));
}
答案 4 :(得分:0)
您可以在某处保存默认背景,当您按下一个/上一个问题按钮时,您应该应用该颜色。例如:
TypedArray array = getTheme().obtainStyledAttributes(new int[] {
android.R.attr.colorBackground,
android.R.attr.textColorPrimary,
});
int backgroundColor = array.getColor(0, 0xFF00FF);
int textColor = array.getColor(1, 0xFF00FF);
array.recycle();
我发现这个代码在线获取背景和文本颜色(你可以保留背景部分),当onClick激活时只需将你的视图背景设置为“backgroundColor”