[英]Android ListView : changing dataset and calling notifyDataSetChanged inside of getView
[英]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.