【问题标题】:How to change the color of text in a TextView generated by an ArrayAdapter如何更改由 ArrayAdapter 生成的 TextView 中的文本颜色
【发布时间】:2017-11-18 00:51:51
【问题描述】:

我正在使用带有 ArrayAdapter 的 ListView,并且我想在用户单击 TextView 时更改其内部文本的颜色。这很好用,除非当一个 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);
    }
});

【问题讨论】:

  • 你需要考虑position...你正在做整个view的改变。

标签: android listview


【解决方案1】:

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

是的。

您可以通过在创建 ArrayAdapter 时覆盖 getView() 来解决此问题,方法如下:

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
    }
};

你实际如何解决它取决于你想要什么行为。看起来您的项目视图确实是 TextViews,因此您可以将 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多