2017-11-18 70 views
0

我正在使用带有ArrayAdapter的ListView,并且我想在用户单击它时更改TextView内部文本的颜色。这工作正常,除非当一个TextView更改颜色另一个更下面的列表更改颜色了。如何更改由ArrayAdapter生成的TextView中的文本颜色

这是否与ArrayAdapter重用视图有关?

ArrayAdapter<String> adapter = new ArrayAdapter<> (thisContext, R.layout.textview_1, arrayList); 
listView.setAdapter (adapter); 

listView.setOnItemClickListener (new AdapterView.OnItemClickListener() 
{ 
    @Override 
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) 
    { 
     TextView textToChange = (TextView) view; 
     textToChange.setTextColor (Color.RED); 
    } 
}); 
+0

你需要采取'position'进去......你在做整个'view'的变化。 – DigitalNinja

回答

1

这是否有东西做ArrayAdapter重用的看法?

是的。

您可以通过覆盖getView()当您创建ArrayAdapter,做这样的事情解决这个问题:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(thisContext, R.layout.textview_1, arrayList) { 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     // TODO 
    } 
}; 

你如何真正去解决这将取决于你想要什么样的行为。这似乎是你的项目意见TextView真的,所以你可以像这样的东西替换TODO:

TextView tv = (TextView) super.getView(position, convertView, parent); 
tv.setTextColor(Color.BLACK); 
return tv; 

这将确保任何回收的观点有黑色文本,但它也意味着,如果你点击在一行上(所以它变成红色),将该行从视图中滚动出来,然后再滚动回查看,它会变回黑色。

也许你可以更新存储从OnItemClickListener内最后一次点击的位置的变量,然后引用在getView()

TextView tv = (TextView) super.getView(position, convertView, parent); 
tv.setTextColor(position == lastClickedPosition ? Color.RED : Color.BLACK); 
return tv; 
相关问题