我创建了Runnable(),它更改了布尔变量(time2),然后调用items.notifyDataSetChanged().它按预期工作,并在结果setViewValue()中调用我的ListView.
这是代码:
items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Override public boolean setViewValue(View view,Cursor cursor,int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Override public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null,Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this,R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this,R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } );
它几乎按预期工作.使用一个次要项目 – 当应显示text2时,它首先将显示的值更改为其他值(来自另一个记录!),然后播放动画. text2到text1的更改正确发生.
我的理解原因如下 – 在显示text2之前,itemTime的所有视图都被删除,因此它被重新创建,这就是为什么一些其他值被显示为秒的原因.但为什么它显示其他记录的价值呢?
实际上text2和text1是数据库中的值,例如.@H_502_13@text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2)),可能,这里出了点问题,用错误的参数调用了setViewValue?
UPD.在setViewValue从数据库中读取text1和text2.以下是完整代码的示例:
itemTime.setText(cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_CLOSE_TIME_1)) + " - " + cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_OPEN_TIME_1)));
解决方法
ListView在内部回收其所有视图,因此您只能创建可在屏幕上显示的视图.但是,这也意味着当您将值绑定到setViewValue方法中的视图时,并不总是会给出之前在列表中位于相同位置的视图.
假设您有三个列表项:itemA,itemB,itemC.每个都分别包含text1,text2和text3.
当你调用items.notifyDataSetChanged()时,ListView会回收所有这些列表项但感觉就像,所以你可能得到一个新的itemC,itemA,itemB的订单;然后文本将读取text3,text1,text2.
因此,当您将第一个列表项的文本更改为“text2”时,您实际上会看到“text3”更改为“text2”,而不是像您期望的那样从“text1”转换为“text2”.