gpt4 book ai didi

android - 如何在ListView中正确使用TextSwitcher?

转载 作者:IT王子 更新时间:2023-10-29 06:22:45 26 4
gpt4 key购买 nike

ListView 中每条记录的 TextSwitcher 应显示第一个值 (text1),然后显示另一个值 (text2),然后再次是第一个值,依此类推。仅当 text2 不为空时才会发生。否则 text1 应始终显示(没有任何更改和动画)。

我创建了 Runnable(),它更改 bool 变量 (time2),然后调用 items.notifyDataSetChanged()。它按预期工作,结果调用了我的 ListViewsetViewValue()

代码如下:

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 的所有 View 都被删除,因此它被重新创建,这就是显示其他值的原因一秒钟。但为什么它显示了其他记录的值(value)?

实际上 text2text1 是来自数据库的值,例如。text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2)),可能是这里出了点问题,setViewValue 调用时使用了错误的参数?

更新。 text1text2setViewValue 中从数据库中读取。这是完整代码的示例:

itemTime.setText(cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_CLOSE_TIME_1)) + " - " + cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_OPEN_TIME_1)));

最佳答案

我知道这可能无法直接回答问题,但我将回应您关于创建 Runnable() 来为您完成切换工作的评论,因为我怀疑它是可能会弄乱您的数据(当您看不到完整代码时很难判断)。

我建议你使用 ViewFlipper而不是 TextSwitcher。这样做的原因是,一旦您在 ViewFlipper 中添加了 TextView,您只需设置翻转间隔,然后开始翻转,它会自动完成给你。

就这么简单:

/* Add your items to your ViewFlipper first */
myViewFlipper.setFlipInterval(1000); //time in millseconds
myViewFlipper.startFlipping();

在您描述的当前方法中,当您调用 items.notifyDataSetChanged() 时,您会遭受巨大的性能损失,因为您的数据库的所有项目都将被重新读取并且您的列表将被再次“重新绘制”。只有当您的实际数据确实发生变化时,您才应该这样做,而不是使用它在您已经拥有的文本之间切换,并且不会随着创建时间而改变。

令人惊喜的是,您可能会注意到您的问题消失了,因为您不必再​​次从数据库中重新读取所有内容,并且减少了混淆 item1 和 item2 的机会,因为您只需要阅读当在您的 ListView

中创建该行时,它们一次

只是我的 2 美分。

告诉我进展如何。

关于android - 如何在ListView中正确使用TextSwitcher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6101470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com