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

时间:2015-11-27 21:48:15

标签: java android listview adapter textcolor

在主题中,当我在已经更改的单元格中使用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);

我还要补充一点,这部分代码在其他线程中循环,因为单元格的vaules每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);
        }
    }

getView:

@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();
}

1 个答案:

答案 0 :(得分:1)

首先这一行 return listView.getAdapter().getView(pos, null, listView); 没有意义,因为通过手动调用,您将在内部始终为列表视图创建和扩充新行,但此视图从未在ListView中使用。请注意,您始终传递第二个参数convertView null,因此内部此方法将创建新视图,但此视图将永远不会在ListView中使用。 提示1.请勿亲自致电getView()方法

正如您可能知道ListView在内存中存储的行/视图数量与在正确使用ViewHolder模式时在屏幕上可见的行/视图一样。

所以现在你要为可见的每一行设置颜色,甚至是ListView中真正不存在的那些不可见的颜色。

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