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 或错误的架构。
如主题所示,当我在我已经更改的单元格中使用 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 或错误的架构。