notifyDataSetChanged() 正在取消更改 ListView 中的 setColor

notifyDataSetChanged() is canceling changing setColor in ListView

如主题所示,当我在我已经更改的单元格中使用 adapter.notifyDataSetChanged() 文本颜色时,它会设置回默认值。我不知道为什么会这样,我把我的改变颜色的方法放在这里:

for(int l=0;l<list.size();l++){
System.out. println("kolorujemy! "+ list.size() );
LinearLayout root = (LinearLayout) getViewByPosition(l,listView);
((TextView) root.findViewById(R.id.wartosc_calosci)).setTextColor(Color.YELLOW);

我还要补充一点,这部分代码在其他线程中循环,因为单元格的值每 30 秒更新一次。这是方法 getViewByPosition:

public View getViewByPosition(int pos, ListView listView) {
        final int firstListItemPosition = listView.getFirstVisiblePosition();
        final int lastListItemPosition = firstListItemPosition + listView.getChildCount();

        if (pos < firstListItemPosition || pos > lastListItemPosition ) {
            return listView.getAdapter().getView(pos, null, listView);
        } else {
            final int childIndex = pos - firstListItemPosition+1;
            return listView.getChildAt(childIndex);
        }
    }

获取视图:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListViewHolder listViewHolder;
if(convertView == null){
    listViewHolder = new ListViewHolder();
    convertView = activity.getLayoutInflater().inflate(R.layout.lista_wlasnych_spolek, null);
    listViewHolder.txtFirst = (TextView) convertView.findViewById(R.id.nazwa_spolki);
    listViewHolder.txtSecond = (TextView) convertView.findViewById(R.id.wartosc_akt);
    listViewHolder.txtThird = (TextView) convertView.findViewById(R.id.wartosc_kupna);
    listViewHolder.txtFourth = (TextView) convertView.findViewById(R.id.wartosc_calosci);
    convertView.setTag(listViewHolder);
} else {
    listViewHolder = (ListViewHolder) convertView.getTag();
}

首先是这一行 return listView.getAdapter().getView(pos, null, listView); 没有意义,因为通过手动调用,您将始终在内部为列表视图创建和扩充新行,但该视图从未在您的 ListView 中使用。看到你总是传递第二个参数 convertView null 所以在内部这个方法将创建新视图但是这个视图将永远不会在你的 ListView 中使用。 提示 1. 不要自己调用 getView() 方法

如您所知,当您正确使用 ViewHolder 模式时,ListView 仅在屏幕上显示的数量 rows/view 存储在内存中。

所以现在您要为可见的每一行设置颜色,甚至为 ListView 中确实不存在的那些不可见的行设置颜色。

提示2. 为任何行着色或更改任何内容的最佳方法是在 getView() 方法实现中进行,具体取决于您的适配器项状态。不要从外部执行此操作,因为它看起来像是某种 hack 或错误的架构。