如何更改ArrayAdapter生成的TextView中的文本颜色

时间:2017-11-18 00:51:52

标签: android listview

我正在使用带有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);
    }
});

1 个答案:

答案 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;