繁体   English   中英

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 Tip 1. 不要自己调用getView()方法

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

因此,现在您正在为可见的每一行设置颜色,甚至为ListView中真正不存在的那些不可见的行设置颜色。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM