我正在使用带有ArrayAdapter的ListView,我想在用户点击它时更改TextView内部的文本颜色。这种方法很好,除非一个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 :(得分: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;