如何更改由ArrayAdapter生成的TextView中的文本颜色
问题描述:
我正在使用带有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);
}
});
答
这是否有东西做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;
你需要采取'position'进去......你在做整个'view'的变化。 – DigitalNinja